Compare commits
	
		
			11 Commits
		
	
	
		
			main
			...
			auto-switc
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| c12706ef05 | |||
| 
						
						
							
						
						8e1f95ebf2
	
				 | 
					
					
						|||
| 
						
						
							
						
						4e0842c607
	
				 | 
					
					
						|||
| 
						
						
							
						
						4fd18e94fd
	
				 | 
					
					
						|||
| 
						
						
							
						
						18bcb434e9
	
				 | 
					
					
						|||
| 
						
						
							
						
						f0ade7274a
	
				 | 
					
					
						|||
| 
						
						
							
						
						674202c6fb
	
				 | 
					
					
						|||
| 
						
						
							
						
						fecaad7af7
	
				 | 
					
					
						|||
| 
						
						
							
						
						befe7ec441
	
				 | 
					
					
						|||
| 
						
						
							
						
						01ce1f154e
	
				 | 
					
					
						|||
| 
						
						
							
						
						2e210a0572
	
				 | 
					
					
						
							
								
								
									
										4
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@@ -22,7 +22,3 @@ __pycache__
 | 
			
		||||
!/.idea/cmake.xml
 | 
			
		||||
 | 
			
		||||
generators/*.db
 | 
			
		||||
 | 
			
		||||
# Clangd LSP
 | 
			
		||||
/compile_commands.json
 | 
			
		||||
/.cache
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										387
									
								
								CHANGELOG.md
									
									
									
									
									
								
							
							
						
						
									
										387
									
								
								CHANGELOG.md
									
									
									
									
									
								
							@@ -16,385 +16,12 @@ will consitute of a breaking change warranting a new major release:
 | 
			
		||||
 | 
			
		||||
# [unreleased]
 | 
			
		||||
 | 
			
		||||
# [v8.2.1] 2025-02-07
 | 
			
		||||
 | 
			
		||||
Patch release with EM changes only.
 | 
			
		||||
 | 
			
		||||
## Changed
 | 
			
		||||
 | 
			
		||||
- BPX battery is not added anymore for EM build, dummy is used by default now.
 | 
			
		||||
 | 
			
		||||
## Fixed
 | 
			
		||||
 | 
			
		||||
- Small fix for `q7s-cp.py` script: Add `-O` argument.
 | 
			
		||||
 | 
			
		||||
# [v8.2.0] 2024-06-26
 | 
			
		||||
 | 
			
		||||
## Changed
 | 
			
		||||
 | 
			
		||||
- STR quaternions are now used by the `MEKF` by default
 | 
			
		||||
- Changed nominal `SUS Assembly` side to `B Side`.
 | 
			
		||||
- Changed source for state machine of detumbling to SUS and MGM only.
 | 
			
		||||
- Changed `FusedRotRateData` dataset to always display rotation rate from SUS and MGM.
 | 
			
		||||
- Solution from `QUEST` will be set to invalid if sun vector and magnetic field vector are too close
 | 
			
		||||
  to each other.
 | 
			
		||||
- Changed collection intervals of dataset collection
 | 
			
		||||
  - `GPS Controller`: `GPS Set` to 60s
 | 
			
		||||
  - `MTQ Handler`: `HK with Torque`, `HK without Torque` to 60s
 | 
			
		||||
  - `RW Handler`: `Status Set` to 30s
 | 
			
		||||
  - `STR Handler`: `Solution Set` to 30s
 | 
			
		||||
  - `ACS Controller`: `MGM Sensor`, `MGM Processed`, `SUS Sensor`, `SUS Processed`, `GYR Sensor`,
 | 
			
		||||
    `GPS Processed` to 60s
 | 
			
		||||
  - `ACS Controller` at or below `IDLE`: `CTRL Values`, `ACT Commands`, `Attitude Estimation`,
 | 
			
		||||
    `Fused Rotation Rate` to 30s
 | 
			
		||||
  - `ACS Controller` above `IDLE`: `CTRL Values`, `ACT Commands`, `Attitude Estimation`,
 | 
			
		||||
    `Fused Rotation Rate` to 10s
 | 
			
		||||
 | 
			
		||||
## Fixed
 | 
			
		||||
 | 
			
		||||
- Added null termination for PLOC MPSoC image taking command which could possibly lead to
 | 
			
		||||
  default target filenames.
 | 
			
		||||
 | 
			
		||||
# [v8.1.1] 2024-06-05
 | 
			
		||||
 | 
			
		||||
## Added
 | 
			
		||||
 | 
			
		||||
- PLOC SUPV MPSoC update re-try logic for the `WRITE_MEMORY` command. These packets form  > 98%
 | 
			
		||||
  of all packets required for a software update, but the update mechanism is not tolerant against
 | 
			
		||||
  occasional glitches on the RS485 communication to the PLOC SUPV. A simple re-try mechanism which
 | 
			
		||||
  tries to re-attempt packet handling up to three times for those packets is introduced.
 | 
			
		||||
 | 
			
		||||
# [v8.1.0] 2024-05-29
 | 
			
		||||
 | 
			
		||||
## Fixed
 | 
			
		||||
 | 
			
		||||
- Small fix for transition failure handling of the MPSoC when the `START_MPSOC` action command
 | 
			
		||||
  to the supervisor fails.
 | 
			
		||||
- Fixed inits of arrays within the `MEKF` not being zeros.
 | 
			
		||||
- Important bugfix for PLOC SUPV: The SUPV previously was able to steal packets from the special
 | 
			
		||||
  communication helper, for example during software updates.
 | 
			
		||||
- Corrected sigma of STR for `MEKF`.
 | 
			
		||||
 | 
			
		||||
## Added
 | 
			
		||||
 | 
			
		||||
- Added new command to cancel the PLOC SUPV special communication helper.
 | 
			
		||||
 | 
			
		||||
# [v8.0.0] 2024-05-13
 | 
			
		||||
 | 
			
		||||
- `eive-tmtc` v7.0.0
 | 
			
		||||
 | 
			
		||||
## Fixed
 | 
			
		||||
 | 
			
		||||
- Fixed calculation for target rotation rate during pointing modes.
 | 
			
		||||
- Possible fix for MPSoC file read algorithm.
 | 
			
		||||
 | 
			
		||||
## Changed
 | 
			
		||||
 | 
			
		||||
- Reworked MPSoC handler to be compatible to new MPSoC software image and use
 | 
			
		||||
  new device handler base class. This should increase the reliability of the communication
 | 
			
		||||
  significantly.
 | 
			
		||||
- MPSoC device modes IDLE, SNAPSHOT and REPLAY are now modelled using submodes.
 | 
			
		||||
- Commanding a submode the device is already in will not result in a completion failure
 | 
			
		||||
  anymore.
 | 
			
		||||
 | 
			
		||||
## Added
 | 
			
		||||
 | 
			
		||||
- Added `VERIFY_BOOT` command for MPSoC.
 | 
			
		||||
- New command for MPSoC to store camera image in chunks.
 | 
			
		||||
 | 
			
		||||
# [v7.8.1] 2024-04-11
 | 
			
		||||
 | 
			
		||||
## Fixed
 | 
			
		||||
 | 
			
		||||
- Reverted fix for wrong order in quaternion multiplication for computation of the error quaternion.
 | 
			
		||||
 | 
			
		||||
# [v7.8.0] 2024-04-10
 | 
			
		||||
 | 
			
		||||
## Changed
 | 
			
		||||
 | 
			
		||||
- Reverted lower OP limit of `PLOC` to -10°C.
 | 
			
		||||
- All pointing laws are now allowed to use the `MEKF` per default.
 | 
			
		||||
- Changed limits in `PWR Controller`.
 | 
			
		||||
- PUS time service: Now dumps the time before and after relative timeshift or setting absolute time
 | 
			
		||||
- The `GPS Controller` does not set itself to `OFF` anymore, if it has not detected a valid fix for
 | 
			
		||||
  some time. Instead it attempts to reset both GNSS devices once.
 | 
			
		||||
- The maximum time to reach a fix is shortened from 30min to 15min.
 | 
			
		||||
- The time the reset pin of the GNSS devices is pulled is prolonged from 5ms to 10s.
 | 
			
		||||
- A `GPS FIX HAS CHANGED` is now only triggered if no fix change has been detected within the past
 | 
			
		||||
  2min. This means, this event might be thrown with a 2min delay. It is instantly thrown, if the mode
 | 
			
		||||
  of the controller is changed. As arguments it now displays the new fix and the numer of fix changes
 | 
			
		||||
  missed.
 | 
			
		||||
- The number of satellites seen and used is reset to 0, in case they are set to invalid.
 | 
			
		||||
- Altitude, latitude and longitude messages are not checked anymore, in case the mode message was
 | 
			
		||||
  already invalid.
 | 
			
		||||
 | 
			
		||||
## Added
 | 
			
		||||
 | 
			
		||||
- PUS timeservice relative timeshift.
 | 
			
		||||
 | 
			
		||||
## Fixed
 | 
			
		||||
 | 
			
		||||
- Fixed wrong order in quaternion multiplication for computation of the error quaternion.
 | 
			
		||||
- Re-worked some FDIR logic in the FSFW. The former logic prevented events with a severity
 | 
			
		||||
  higher than INFO if the device was in EXTERNAL CONTROL. The new logic will allow to trigger
 | 
			
		||||
  events but still inhibit FDIR reactions if the device is in EXTERNAL CONTROL.
 | 
			
		||||
 | 
			
		||||
# [v7.7.4] 2024-03-21
 | 
			
		||||
 | 
			
		||||
## Changed
 | 
			
		||||
 | 
			
		||||
- Rotational rate limit for the GS target pointing is now seperated from controller limit. It
 | 
			
		||||
  is also reduced to 0.75°/s now.
 | 
			
		||||
 | 
			
		||||
## Fixed
 | 
			
		||||
 | 
			
		||||
- Fixed wrong sign in calculation of total current within the `PWR Controller`.
 | 
			
		||||
 | 
			
		||||
# [v7.7.3] 2024-03-18
 | 
			
		||||
 | 
			
		||||
- Bumped `eive-fsfw`
 | 
			
		||||
 | 
			
		||||
## Added
 | 
			
		||||
 | 
			
		||||
- Added parameter to disable STR input for MEKF.
 | 
			
		||||
 | 
			
		||||
## Changed
 | 
			
		||||
 | 
			
		||||
- If a primary heater is set to `EXTERNAL CONTROL` and `ON`, the `TCS Controller` will no
 | 
			
		||||
  try to control the temperature of that object.
 | 
			
		||||
- Set lower OP limit of `PLOC` to -5°C.
 | 
			
		||||
 | 
			
		||||
## Fixed
 | 
			
		||||
 | 
			
		||||
- Added prevention of sign jump for target quaternion of GS pointing, which would reduce the
 | 
			
		||||
  performance of the controller.
 | 
			
		||||
- Heaters set to `EXTERNAL CONTROL` no longer can be switched off by the `TCS Controller`, if
 | 
			
		||||
  they violate the maximum burn duration of the controller.
 | 
			
		||||
 | 
			
		||||
# [v7.7.2] 2024-03-06
 | 
			
		||||
 | 
			
		||||
## Fixed
 | 
			
		||||
 | 
			
		||||
- Camera and E-band antenna now point towards the target instead of away from the target for the
 | 
			
		||||
  pointing target mode.
 | 
			
		||||
 | 
			
		||||
# [v7.7.1] 2024-03-06
 | 
			
		||||
 | 
			
		||||
- Bumped `eive-tmtc` to v6.1.1
 | 
			
		||||
- Bumped `eive-fsfw`
 | 
			
		||||
 | 
			
		||||
## Added
 | 
			
		||||
 | 
			
		||||
- The `CoreController` now sets the leap seconds on initalization. They are stored in a persistent
 | 
			
		||||
  file. If the file does yet not exist, it will be created. The leap seconds can be updated using an
 | 
			
		||||
  action command. This will also update the file.
 | 
			
		||||
 | 
			
		||||
## Fixed
 | 
			
		||||
 | 
			
		||||
- Fixed wrong dimension of a matrix within the `MEKF`, which would lead to a seg fault, if the
 | 
			
		||||
  star tracker was available.
 | 
			
		||||
- Fixed case in which control values within the `AcsController` could become NaN.
 | 
			
		||||
 | 
			
		||||
# [v7.7.0] 2024-02-29
 | 
			
		||||
 | 
			
		||||
- Bumped `eive-tmtc` to v6.1.0
 | 
			
		||||
- Bumped `eive-fsfw`
 | 
			
		||||
 | 
			
		||||
## Fixed
 | 
			
		||||
 | 
			
		||||
- PLOC SUPV sets: Added missing `PoolReadGuard` instantiations when reading boot status report
 | 
			
		||||
  and latchup status report.
 | 
			
		||||
- PLOC SUPV latchup report could not be handled previously.
 | 
			
		||||
- Bugfix in PLOC SUPV latchup report parsing.
 | 
			
		||||
- Bugfix in PLOC MPSoC HK set: Set and variables were not set valid.
 | 
			
		||||
- The `PTG_CTRL_NO_ATTITUDE_INFORMATION` will now actually trigger a fallback into safe mode
 | 
			
		||||
  and is triggered by the `AcsController` now.
 | 
			
		||||
- Fixed a corner case, in which an invalid speed command could be sent to the `RwHandler`.
 | 
			
		||||
- Fixed calculation of desaturation torque for faulty RWs.
 | 
			
		||||
- Fixed bugs within the `MEKF` and simplified the code.
 | 
			
		||||
 | 
			
		||||
## Changed
 | 
			
		||||
 | 
			
		||||
- `FusedRotationRate` now only uses rotation rate from QUEST and STR in higher modes
 | 
			
		||||
- QUEST and STR rates are now allowed per default
 | 
			
		||||
- Changed PTG Strat priorities to favor STR before MEKF.
 | 
			
		||||
- Increased message queue depth and maximum number of handled messages per cycle for
 | 
			
		||||
  `PusServiceBase` based classes (especially PUS scheduler).
 | 
			
		||||
- `MathOperations` functions were moved to their appropriate classes within the `eive-fsfw`
 | 
			
		||||
- Changed pointing strategy for target groundstation mode to prevent blinding of the STR. This
 | 
			
		||||
  also limits the rotation for the reference target quaternion to prevent spikes in required
 | 
			
		||||
  rotation rates.
 | 
			
		||||
- Updated QUEST and Sun Vector Params to new values.
 | 
			
		||||
- Removed the satellites's angular momentum from desaturation calculation.
 | 
			
		||||
- Bumped internal `sagittactl` library to v11.11.
 | 
			
		||||
 | 
			
		||||
## Added
 | 
			
		||||
 | 
			
		||||
- Updated STR handler to unlock and allow using the secondary firmware slot.
 | 
			
		||||
- STR handling for new BlobStats TM set.
 | 
			
		||||
- Added new action command to update the standard deviations within the `MEKF` from the
 | 
			
		||||
  `AcsParameters`.
 | 
			
		||||
 | 
			
		||||
# [v7.6.1] 2024-02-05
 | 
			
		||||
 | 
			
		||||
## Changed
 | 
			
		||||
 | 
			
		||||
- Guidance now uses the coordinate functions from the FSFW.
 | 
			
		||||
- Idle should now point the STR away from the earth
 | 
			
		||||
 | 
			
		||||
## Fixed
 | 
			
		||||
 | 
			
		||||
- Fixed bugs in `Guidance::comparePtg` and corrected overloading
 | 
			
		||||
- Detumbling State Machine is now robust to commanded mode changes.
 | 
			
		||||
 | 
			
		||||
# [v7.6.0] 2024-01-30
 | 
			
		||||
 | 
			
		||||
- Bumped `eive-tmtc` to v5.13.0
 | 
			
		||||
- Bumped `eive-fsfw`
 | 
			
		||||
 | 
			
		||||
## Added
 | 
			
		||||
 | 
			
		||||
- Added new parameter for MPSoC which allows to skip SUPV commanding.
 | 
			
		||||
 | 
			
		||||
## Changed
 | 
			
		||||
 | 
			
		||||
- Increased allowed mode transition time for PLOC SUPV.
 | 
			
		||||
- Detumbling can now be triggered from all modes of the `AcsController`. In case the
 | 
			
		||||
  current mode is a higher pointing mode, the STR will be set to faulty, to trigger a
 | 
			
		||||
  transition to safe first. Then, in a second step, a transition to detumble is triggered.
 | 
			
		||||
 | 
			
		||||
## Fixed
 | 
			
		||||
 | 
			
		||||
- If the PCDU handler fails reading data from the IPC store, it will
 | 
			
		||||
  not try to do a deserialization anymore.
 | 
			
		||||
- All action commands sent by the PLOC SUPV to itself will have no sender now.
 | 
			
		||||
- RW speed commands get reset to 0 RPM, if the `AcsController` has changed its mode
 | 
			
		||||
  to Safe
 | 
			
		||||
- Antistiction for RWs will set commanded speed to 0 RPM, if a wheel is detected as not
 | 
			
		||||
  working
 | 
			
		||||
- Removed parameter to disable antistiction, as deactivating it would result in the
 | 
			
		||||
  `AcsController` being allowed sending invalid speed commands to the RW Handler, which
 | 
			
		||||
  would then trigger FDIR and turning off the functioning device
 | 
			
		||||
- `RwHandler` returnvalues would use the `INTERFACE_ID` of the `DeviceHandlerBase`
 | 
			
		||||
- The `AcsController` will reset its stored guidance values on mode change and lost
 | 
			
		||||
  orientation.
 | 
			
		||||
- The nullspace controller will only be used if all RWs are available.
 | 
			
		||||
- Calculation of required rotation rate in pointing modes has been fixed to actual
 | 
			
		||||
  calculation of rotation rate from two quaternions.
 | 
			
		||||
- Fixed alignment matrix and pseudo inverses of RWs, to match the wrong definition of
 | 
			
		||||
  positive rotation.
 | 
			
		||||
 | 
			
		||||
# [v7.5.5] 2024-01-22
 | 
			
		||||
 | 
			
		||||
## Fixed
 | 
			
		||||
 | 
			
		||||
- Calculation of error quaternion was done with inverse of the required target quaternion.
 | 
			
		||||
 | 
			
		||||
# [v7.5.4] 2024-01-16
 | 
			
		||||
 | 
			
		||||
## Fixed
 | 
			
		||||
 | 
			
		||||
- Pointing strategy now actually uses fused rotation rate source instead of its valid flag.
 | 
			
		||||
- All datasets now get updated during pointing mode, even if the strategy is a fault one.
 | 
			
		||||
 | 
			
		||||
# [v7.5.3] 2023-12-19
 | 
			
		||||
 | 
			
		||||
## Fixed
 | 
			
		||||
 | 
			
		||||
- Set STR quaternions to invalid in device handler if the solution is not trustworthy.
 | 
			
		||||
 | 
			
		||||
# [v7.5.2] 2023-12-14
 | 
			
		||||
 | 
			
		||||
## Fixed
 | 
			
		||||
 | 
			
		||||
- Fixed faulty scaling within the QUEST algorithm.
 | 
			
		||||
 | 
			
		||||
# [v7.5.1] 2023-12-13
 | 
			
		||||
 | 
			
		||||
- `eive-tmtc` v5.12.1
 | 
			
		||||
 | 
			
		||||
## Changed
 | 
			
		||||
 | 
			
		||||
- Increased the maximum number of scheduled telecommands from 500 to 4000. Merry Christmas!
 | 
			
		||||
 | 
			
		||||
## Fixed
 | 
			
		||||
 | 
			
		||||
- Faulty mapping of input values for QUEST algorithm.
 | 
			
		||||
- Fixed validity check for QUEST algorithm.
 | 
			
		||||
 | 
			
		||||
# [v7.5.0] 2023-12-06
 | 
			
		||||
 | 
			
		||||
- `eive-tmtc` v5.12.0
 | 
			
		||||
 | 
			
		||||
## Changed
 | 
			
		||||
 | 
			
		||||
- ACS-Board default side changed to B-Side
 | 
			
		||||
- The TLE uploaded now gets stored in a file on the filesystem. It will always be stored on
 | 
			
		||||
  the current active SD Card. After a reboot, the TLE will be read from the filesystem.
 | 
			
		||||
  A filesystem change via `prefSD` on bootup, can lead to the TLE not being read, even
 | 
			
		||||
  though it is there.
 | 
			
		||||
- Added action cmd to read the currently stored TLE.
 | 
			
		||||
- Both the `AcsController` and the `PwrController` now use the monotonic clock to calculate
 | 
			
		||||
  the time difference.
 | 
			
		||||
- `ACS Controller` now has the function `performAttitudeControl` which is called prior to passing
 | 
			
		||||
  on to the relevant mode functions. It handles all telemetry relevant functions, which were
 | 
			
		||||
  always called, regardless of the mode.
 | 
			
		||||
 | 
			
		||||
## Added
 | 
			
		||||
 | 
			
		||||
- Higher ACS modes can now be entered without a running `MEKF`. Higher modes will collect their
 | 
			
		||||
  quaternion and rotational rate depending on the available sources.
 | 
			
		||||
- `QUEST` attitude estimation was added to the `AcsController`.
 | 
			
		||||
- The fused rotational rate can now be estimated from `QUEST` and the `STR`.
 | 
			
		||||
 | 
			
		||||
# [v7.4.1] 2023-12-06
 | 
			
		||||
 | 
			
		||||
## Fixed
 | 
			
		||||
 | 
			
		||||
- Schedule SCEX again. Scheduling was removed accidentaly when Payload Task was converted to a PST.
 | 
			
		||||
- SCEX transition was previously 0 seconds.. which did not lead to bugs? In any case it is 5
 | 
			
		||||
  seconds now.
 | 
			
		||||
 | 
			
		||||
# [v7.4.0] 2023-11-30
 | 
			
		||||
 | 
			
		||||
- `eive-tmtc` v5.11.0
 | 
			
		||||
 | 
			
		||||
## Changed
 | 
			
		||||
 | 
			
		||||
- Rewrote the PLOC Supervisor Handler, which is now based on a new device handler base class.
 | 
			
		||||
  Added ADC and Logging Counters telemetry set support.
 | 
			
		||||
 | 
			
		||||
## Fixed
 | 
			
		||||
 | 
			
		||||
- Increase allowed time for PTME writers to finish partial transfers. A duration of 200 ms was
 | 
			
		||||
  not sufficient for cases where 3 writers write concurrently.
 | 
			
		||||
- Fixed state issue for PTME writer object where the writer was not reset properly after a timeout
 | 
			
		||||
  of a partial transfer. This was a major bug blocking the whole VC if it occured.
 | 
			
		||||
- STR config path was previously hardcoded to `/mnt/sd0/startracker/flight-config.json`.
 | 
			
		||||
  A new abstraction was introduces which now uses the active SD card to build the correct
 | 
			
		||||
  config path when initializing the star tracker.
 | 
			
		||||
 | 
			
		||||
## Added
 | 
			
		||||
 | 
			
		||||
- PL PCDU: Add command to enable and disable channel order checks.
 | 
			
		||||
- Added new PUS 15 subservice `DELETE_BY_TIME_RANGE` which allows to also specify a deletion
 | 
			
		||||
  start time when deleting packets from the persistent TM store.
 | 
			
		||||
- Introduced a new `RELOAD_JSON_CFG_FILE` command for the STR to reload the JSON configuration
 | 
			
		||||
  data based on the current output of the config file path getter function. A reboot of the
 | 
			
		||||
  device is still necessary to load the configuration to the STR.
 | 
			
		||||
 | 
			
		||||
# [v7.3.0] 2023-11-07
 | 
			
		||||
 | 
			
		||||
## Changed
 | 
			
		||||
 | 
			
		||||
- Changed PDEC addresses depending on which firmware version is used. It is suspected that
 | 
			
		||||
  the previous addresses were invalid and not properly covered by the Linux memory protection.
 | 
			
		||||
  The OBSW will use the old addresses for older FW versions.
 | 
			
		||||
- Reverted some STR ComIF behaviour back to an older software version.
 | 
			
		||||
 | 
			
		||||
## Added
 | 
			
		||||
 | 
			
		||||
- Always add PLOC MPSoC and PLOC SUPV components for the EM as well.
 | 
			
		||||
- Added a new safety mechanism where the ProASIC scratch buffer can be used to trigger an
 | 
			
		||||
  auto-boot to another image. The auto-boot is currently implemented as a one-shot mechanism:
 | 
			
		||||
  The key-value pair which triggers the auto-boot will be removed from the scratch buffer.
 | 
			
		||||
  See more information [here](https://egit.irs.uni-stuttgart.de/redmine/projects/eive-flight-manual/wiki/OBC_Auto_Switch_Image)
 | 
			
		||||
 | 
			
		||||
# [v7.2.0] 2023-10-27
 | 
			
		||||
 | 
			
		||||
@@ -1064,7 +691,7 @@ This is the version which will fly on the satellite for the initial launch phase
 | 
			
		||||
  This gives other tasks some time to register the SD cards being unusable, and therefore provides
 | 
			
		||||
  a way for them to perform any re-initialization tasks necessary after SD card switches.
 | 
			
		||||
- TCS controller now only has an OFF mode and an ON mode
 | 
			
		||||
- The TCS controller pauses operations related to the TCS board assembly (reading sensors and
 | 
			
		||||
- The TCS controller pauses operations related to the TCS board assembly (reading sensors and 
 | 
			
		||||
  the primary control loop) while a TCS board recovery is on-going.
 | 
			
		||||
- Allow specifying custom OBSW update filename. This allowed keeping a cleaner file structure
 | 
			
		||||
  where each update has a name including the version
 | 
			
		||||
@@ -2129,8 +1756,8 @@ Syrlinks PR: PR: https://egit.irs.uni-stuttgart.de/eive/eive-obsw/pulls/353
 | 
			
		||||
- Syrlinks Handler: Read RX frequency shift as 24 bit signed number now. Also include
 | 
			
		||||
  validity handling for datasets.
 | 
			
		||||
  PR: https://egit.irs.uni-stuttgart.de/eive/eive-obsw/pulls/350
 | 
			
		||||
- `GyroADIS1650XHandler`: Changed calculation of angular rate to be sensitivity based instead of
 | 
			
		||||
  max. range based, as previous fix still left an margin of error between ADIS16505 sensors
 | 
			
		||||
- `GyroADIS1650XHandler`: Changed calculation of angular rate to be sensitivity based instead of 
 | 
			
		||||
  max. range based, as previous fix still left an margin of error between ADIS16505 sensors 
 | 
			
		||||
  and L3GD20 sensors.
 | 
			
		||||
  PR: https://egit.irs.uni-stuttgart.de/eive/eive-obsw/pulls/346
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -9,9 +9,9 @@
 | 
			
		||||
# ##############################################################################
 | 
			
		||||
cmake_minimum_required(VERSION 3.13)
 | 
			
		||||
 | 
			
		||||
set(OBSW_VERSION_MAJOR 8)
 | 
			
		||||
set(OBSW_VERSION_MAJOR 7)
 | 
			
		||||
set(OBSW_VERSION_MINOR 2)
 | 
			
		||||
set(OBSW_VERSION_REVISION 1)
 | 
			
		||||
set(OBSW_VERSION_REVISION 0)
 | 
			
		||||
 | 
			
		||||
# set(CMAKE_VERBOSE TRUE)
 | 
			
		||||
 | 
			
		||||
@@ -64,19 +64,19 @@ include(EiveHelpers)
 | 
			
		||||
option(EIVE_ADD_ETL_LIB "Add ETL library" ON)
 | 
			
		||||
option(EIVE_ADD_JSON_LIB "Add JSON library" ON)
 | 
			
		||||
 | 
			
		||||
set(OBSW_MAX_SCHEDULED_TCS 4000)
 | 
			
		||||
set(OBSW_MAX_SCHEDULED_TCS 500)
 | 
			
		||||
 | 
			
		||||
if(EIVE_Q7S_EM)
 | 
			
		||||
  set(OBSW_Q7S_EM
 | 
			
		||||
      1
 | 
			
		||||
      CACHE STRING "Q7S EM configuration")
 | 
			
		||||
  set(OBSW_Q7S_FM 0)
 | 
			
		||||
  set(INIT_VAL 0)
 | 
			
		||||
  set(OBSW_STAR_TRACKER_GROUND_CONFIG 1)
 | 
			
		||||
else()
 | 
			
		||||
  set(OBSW_Q7S_EM
 | 
			
		||||
      0
 | 
			
		||||
      CACHE STRING "Q7S EM configuration")
 | 
			
		||||
  set(OBSW_Q7S_FM 1)
 | 
			
		||||
  set(INIT_VAL 1)
 | 
			
		||||
  set(OBSW_STAR_TRACKER_GROUND_CONFIG 0)
 | 
			
		||||
endif()
 | 
			
		||||
 | 
			
		||||
@@ -87,19 +87,19 @@ set(OBSW_ADD_TMTC_UDP_SERVER
 | 
			
		||||
    0
 | 
			
		||||
    CACHE STRING "Add UDP TMTC Server")
 | 
			
		||||
set(OBSW_ADD_MGT
 | 
			
		||||
    ${OBSW_Q7S_FM}
 | 
			
		||||
    ${INIT_VAL}
 | 
			
		||||
    CACHE STRING "Add MGT module")
 | 
			
		||||
set(OBSW_ADD_BPX_BATTERY_HANDLER
 | 
			
		||||
    ${OBSW_Q7S_FM}
 | 
			
		||||
    1
 | 
			
		||||
    CACHE STRING "Add BPX battery module")
 | 
			
		||||
set(OBSW_ADD_STAR_TRACKER
 | 
			
		||||
    1
 | 
			
		||||
    CACHE STRING "Add Startracker module")
 | 
			
		||||
set(OBSW_ADD_SUN_SENSORS
 | 
			
		||||
    ${OBSW_Q7S_FM}
 | 
			
		||||
    ${INIT_VAL}
 | 
			
		||||
    CACHE STRING "Add sun sensor module")
 | 
			
		||||
set(OBSW_ADD_SUS_BOARD_ASS
 | 
			
		||||
    ${OBSW_Q7S_FM}
 | 
			
		||||
    ${INIT_VAL}
 | 
			
		||||
    CACHE STRING "Add sun sensor board assembly")
 | 
			
		||||
set(OBSW_ADD_THERMAL_TEMP_INSERTER
 | 
			
		||||
    ${OBSW_Q7S_EM}
 | 
			
		||||
@@ -108,7 +108,7 @@ set(OBSW_ADD_ACS_BOARD
 | 
			
		||||
    1
 | 
			
		||||
    CACHE STRING "Add ACS board module")
 | 
			
		||||
set(OBSW_ADD_GPS_CTRL
 | 
			
		||||
    ${OBSW_Q7S_FM}
 | 
			
		||||
    ${INIT_VAL}
 | 
			
		||||
    CACHE STRING "Add GPS controllers")
 | 
			
		||||
set(OBSW_ADD_CCSDS_IP_CORES
 | 
			
		||||
    1
 | 
			
		||||
@@ -126,22 +126,22 @@ set(OBSW_ADD_HEATERS
 | 
			
		||||
    1
 | 
			
		||||
    CACHE STRING "Add TCS heaters")
 | 
			
		||||
set(OBSW_ADD_PLOC_SUPERVISOR
 | 
			
		||||
    1
 | 
			
		||||
    ${INIT_VAL}
 | 
			
		||||
    CACHE STRING "Add PLOC supervisor handler")
 | 
			
		||||
set(OBSW_ADD_SA_DEPL
 | 
			
		||||
    ${OBSW_Q7S_FM}
 | 
			
		||||
    ${INIT_VAL}
 | 
			
		||||
    CACHE STRING "Add SA deployment handler")
 | 
			
		||||
set(OBSW_ADD_PLOC_MPSOC
 | 
			
		||||
    1
 | 
			
		||||
    ${INIT_VAL}
 | 
			
		||||
    CACHE STRING "Add MPSoC handler")
 | 
			
		||||
set(OBSW_ADD_ACS_CTRL
 | 
			
		||||
    ${OBSW_Q7S_FM}
 | 
			
		||||
    ${INIT_VAL}
 | 
			
		||||
    CACHE STRING "Add ACS controller")
 | 
			
		||||
set(OBSW_ADD_RTD_DEVICES
 | 
			
		||||
    ${OBSW_Q7S_FM}
 | 
			
		||||
    ${INIT_VAL}
 | 
			
		||||
    CACHE STRING "Add RTD devices")
 | 
			
		||||
set(OBSW_ADD_RAD_SENSORS
 | 
			
		||||
    ${OBSW_Q7S_FM}
 | 
			
		||||
    ${INIT_VAL}
 | 
			
		||||
    CACHE STRING "Add Rad Sensor module")
 | 
			
		||||
set(OBSW_ADD_PL_PCDU
 | 
			
		||||
    1
 | 
			
		||||
@@ -156,10 +156,10 @@ set(OBSW_ADD_GOMSPACE_PCDU
 | 
			
		||||
    1
 | 
			
		||||
    CACHE STRING "Add GomSpace PCDU modules")
 | 
			
		||||
set(OBSW_ADD_GOMSPACE_ACU
 | 
			
		||||
    ${OBSW_Q7S_FM}
 | 
			
		||||
    ${INIT_VAL}
 | 
			
		||||
    CACHE STRING "Add GomSpace ACU submodule")
 | 
			
		||||
set(OBSW_ADD_RW
 | 
			
		||||
    ${OBSW_Q7S_FM}
 | 
			
		||||
    ${INIT_VAL}
 | 
			
		||||
    CACHE STRING "Add RW modules")
 | 
			
		||||
set(OBSW_ADD_SCEX_DEVICE
 | 
			
		||||
    1
 | 
			
		||||
 
 | 
			
		||||
@@ -3,11 +3,6 @@
 | 
			
		||||
<a id="top"></a> <a name="linux"></a> EIVE On-Board Software
 | 
			
		||||
======
 | 
			
		||||
 | 
			
		||||
This is the on-board software for the
 | 
			
		||||
[EIVE](https://www.ilh.uni-stuttgart.de/forschung/mmw/EIVE/
 | 
			
		||||
) project which was [launched in 2023](https://www.uni-stuttgart.de/en/university/news/all/EIVE-satellite-explores-new-frequency-range-in-space/) and concluded successfully
 | 
			
		||||
when the mission re-entered the atmosphere in 2024.
 | 
			
		||||
 | 
			
		||||
# Index
 | 
			
		||||
 | 
			
		||||
1. [General](#general)
 | 
			
		||||
 
 | 
			
		||||
@@ -1,545 +0,0 @@
 | 
			
		||||
#include <fsfw/globalfunctions/arrayprinter.h>
 | 
			
		||||
#include <fsfw/tasks/TaskFactory.h>
 | 
			
		||||
#include <linux/payload/PlocMpsocSpecialComHelperLegacy.h>
 | 
			
		||||
#include <unistd.h>
 | 
			
		||||
 | 
			
		||||
#include <filesystem>
 | 
			
		||||
#include <fstream>
 | 
			
		||||
 | 
			
		||||
#ifdef XIPHOS_Q7S
 | 
			
		||||
#include "bsp_q7s/fs/FilesystemHelper.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include "mission/utility/Timestamp.h"
 | 
			
		||||
 | 
			
		||||
using namespace ploc;
 | 
			
		||||
 | 
			
		||||
PlocMpsocSpecialComHelperLegacy::PlocMpsocSpecialComHelperLegacy(object_id_t objectId)
 | 
			
		||||
    : SystemObject(objectId) {
 | 
			
		||||
  spParams.buf = commandBuffer;
 | 
			
		||||
  spParams.maxSize = sizeof(commandBuffer);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
PlocMpsocSpecialComHelperLegacy::~PlocMpsocSpecialComHelperLegacy() {}
 | 
			
		||||
 | 
			
		||||
ReturnValue_t PlocMpsocSpecialComHelperLegacy::initialize() {
 | 
			
		||||
#ifdef XIPHOS_Q7S
 | 
			
		||||
  sdcMan = SdCardManager::instance();
 | 
			
		||||
  if (sdcMan == nullptr) {
 | 
			
		||||
    sif::warning << "PlocMPSoCHelper::initialize: Invalid SD Card Manager" << std::endl;
 | 
			
		||||
    return returnvalue::FAILED;
 | 
			
		||||
  }
 | 
			
		||||
#endif
 | 
			
		||||
  return returnvalue::OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ReturnValue_t PlocMpsocSpecialComHelperLegacy::performOperation(uint8_t operationCode) {
 | 
			
		||||
  ReturnValue_t result = returnvalue::OK;
 | 
			
		||||
  semaphore.acquire();
 | 
			
		||||
  while (true) {
 | 
			
		||||
#if OBSW_THREAD_TRACING == 1
 | 
			
		||||
    trace::threadTrace(opCounter, "PLOC MPSOC Helper");
 | 
			
		||||
#endif
 | 
			
		||||
    switch (internalState) {
 | 
			
		||||
      case InternalState::IDLE: {
 | 
			
		||||
        semaphore.acquire();
 | 
			
		||||
        break;
 | 
			
		||||
      }
 | 
			
		||||
      case InternalState::FLASH_WRITE: {
 | 
			
		||||
        result = performFlashWrite();
 | 
			
		||||
        if (result == returnvalue::OK) {
 | 
			
		||||
          triggerEvent(MPSOC_FLASH_WRITE_SUCCESSFUL, sequenceCount->get());
 | 
			
		||||
        } else {
 | 
			
		||||
          triggerEvent(MPSOC_FLASH_WRITE_FAILED, sequenceCount->get());
 | 
			
		||||
        }
 | 
			
		||||
        internalState = InternalState::IDLE;
 | 
			
		||||
        break;
 | 
			
		||||
      }
 | 
			
		||||
      case InternalState::FLASH_READ: {
 | 
			
		||||
        result = performFlashRead();
 | 
			
		||||
        if (result == returnvalue::OK) {
 | 
			
		||||
          triggerEvent(MPSOC_FLASH_READ_SUCCESSFUL, sequenceCount->get());
 | 
			
		||||
        } else {
 | 
			
		||||
          triggerEvent(MPSOC_FLASH_READ_FAILED, sequenceCount->get());
 | 
			
		||||
        }
 | 
			
		||||
        internalState = InternalState::IDLE;
 | 
			
		||||
        break;
 | 
			
		||||
      }
 | 
			
		||||
      default:
 | 
			
		||||
        sif::debug << "PlocMPSoCHelper::performOperation: Invalid state" << std::endl;
 | 
			
		||||
        break;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ReturnValue_t PlocMpsocSpecialComHelperLegacy::setComIF(
 | 
			
		||||
    DeviceCommunicationIF* communicationInterface_) {
 | 
			
		||||
  uartComIF = dynamic_cast<SerialComIF*>(communicationInterface_);
 | 
			
		||||
  if (uartComIF == nullptr) {
 | 
			
		||||
    sif::warning << "PlocMPSoCHelper::initialize: Invalid uart com if" << std::endl;
 | 
			
		||||
    return returnvalue::FAILED;
 | 
			
		||||
  }
 | 
			
		||||
  return returnvalue::OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void PlocMpsocSpecialComHelperLegacy::setComCookie(CookieIF* comCookie_) { comCookie = comCookie_; }
 | 
			
		||||
 | 
			
		||||
void PlocMpsocSpecialComHelperLegacy::setSequenceCount(SourceSequenceCounter* sequenceCount_) {
 | 
			
		||||
  sequenceCount = sequenceCount_;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ReturnValue_t PlocMpsocSpecialComHelperLegacy::startFlashWrite(std::string obcFile,
 | 
			
		||||
                                                               std::string mpsocFile) {
 | 
			
		||||
  if (internalState != InternalState::IDLE) {
 | 
			
		||||
    return returnvalue::FAILED;
 | 
			
		||||
  }
 | 
			
		||||
  ReturnValue_t result = startFlashReadOrWriteBase(std::move(obcFile), std::move(mpsocFile));
 | 
			
		||||
  if (result != returnvalue::OK) {
 | 
			
		||||
    return result;
 | 
			
		||||
  }
 | 
			
		||||
  internalState = InternalState::FLASH_WRITE;
 | 
			
		||||
  return semaphore.release();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ReturnValue_t PlocMpsocSpecialComHelperLegacy::startFlashRead(std::string obcFile,
 | 
			
		||||
                                                              std::string mpsocFile,
 | 
			
		||||
                                                              size_t readFileSize) {
 | 
			
		||||
  if (internalState != InternalState::IDLE) {
 | 
			
		||||
    return returnvalue::FAILED;
 | 
			
		||||
  }
 | 
			
		||||
  ReturnValue_t result = startFlashReadOrWriteBase(std::move(obcFile), std::move(mpsocFile));
 | 
			
		||||
  if (result != returnvalue::OK) {
 | 
			
		||||
    return result;
 | 
			
		||||
  }
 | 
			
		||||
  flashReadAndWrite.totalReadSize = readFileSize;
 | 
			
		||||
  internalState = InternalState::FLASH_READ;
 | 
			
		||||
  return semaphore.release();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void PlocMpsocSpecialComHelperLegacy::resetHelper() {
 | 
			
		||||
  spParams.buf = commandBuffer;
 | 
			
		||||
  terminate = false;
 | 
			
		||||
  uartComIF->flushUartRxBuffer(comCookie);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void PlocMpsocSpecialComHelperLegacy::stopProcess() { terminate = true; }
 | 
			
		||||
 | 
			
		||||
ReturnValue_t PlocMpsocSpecialComHelperLegacy::performFlashWrite() {
 | 
			
		||||
  ReturnValue_t result = returnvalue::OK;
 | 
			
		||||
  std::ifstream file(flashReadAndWrite.obcFile, std::ifstream::binary);
 | 
			
		||||
  if (file.bad()) {
 | 
			
		||||
    return returnvalue::FAILED;
 | 
			
		||||
  }
 | 
			
		||||
  result = flashfopen(mpsoc::FileAccessModes::WRITE | mpsoc::FileAccessModes::OPEN_ALWAYS);
 | 
			
		||||
  if (result != returnvalue::OK) {
 | 
			
		||||
    return result;
 | 
			
		||||
  }
 | 
			
		||||
  // Set position of next character to end of file input stream
 | 
			
		||||
  file.seekg(0, file.end);
 | 
			
		||||
  // tellg returns position of character in input stream
 | 
			
		||||
  size_t remainingSize = file.tellg();
 | 
			
		||||
  size_t dataLength = 0;
 | 
			
		||||
  size_t bytesRead = 0;
 | 
			
		||||
  while (remainingSize > 0) {
 | 
			
		||||
    if (terminate) {
 | 
			
		||||
      return returnvalue::OK;
 | 
			
		||||
    }
 | 
			
		||||
    // The minus 4 is necessary for unknown reasons. Maybe some bug in the ILH software?
 | 
			
		||||
    if (remainingSize > mpsoc::MAX_FLASH_WRITE_DATA_SIZE - 4) {
 | 
			
		||||
      dataLength = mpsoc::MAX_FLASH_WRITE_DATA_SIZE - 4;
 | 
			
		||||
    } else {
 | 
			
		||||
      dataLength = remainingSize;
 | 
			
		||||
    }
 | 
			
		||||
    if (file.bad() or not file.is_open()) {
 | 
			
		||||
      return FILE_WRITE_ERROR;
 | 
			
		||||
    }
 | 
			
		||||
    file.seekg(bytesRead, file.beg);
 | 
			
		||||
    file.read(reinterpret_cast<char*>(fileBuf.data()), dataLength);
 | 
			
		||||
    bytesRead += dataLength;
 | 
			
		||||
    remainingSize -= dataLength;
 | 
			
		||||
    mpsoc::TcFlashWrite tc(spParams, *sequenceCount);
 | 
			
		||||
    result = tc.setPayload(fileBuf.data(), dataLength);
 | 
			
		||||
    if (result != returnvalue::OK) {
 | 
			
		||||
      return result;
 | 
			
		||||
    }
 | 
			
		||||
    result = tc.finishPacket();
 | 
			
		||||
    if (result != returnvalue::OK) {
 | 
			
		||||
      return result;
 | 
			
		||||
    }
 | 
			
		||||
    (*sequenceCount)++;
 | 
			
		||||
    result = handlePacketTransmissionNoReply(tc);
 | 
			
		||||
    if (result != returnvalue::OK) {
 | 
			
		||||
      return result;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  result = flashfclose();
 | 
			
		||||
  if (result != returnvalue::OK) {
 | 
			
		||||
    return result;
 | 
			
		||||
  }
 | 
			
		||||
  return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ReturnValue_t PlocMpsocSpecialComHelperLegacy::performFlashRead() {
 | 
			
		||||
  std::error_code e;
 | 
			
		||||
  std::ofstream ofile(flashReadAndWrite.obcFile, std::ios::trunc | std::ios::binary);
 | 
			
		||||
  if (ofile.bad()) {
 | 
			
		||||
    return returnvalue::FAILED;
 | 
			
		||||
  }
 | 
			
		||||
  ReturnValue_t result = flashfopen(mpsoc::FileAccessModes::READ);
 | 
			
		||||
  if (result != returnvalue::OK) {
 | 
			
		||||
    std::filesystem::remove(flashReadAndWrite.obcFile, e);
 | 
			
		||||
    return result;
 | 
			
		||||
  }
 | 
			
		||||
  size_t readSoFar = 0;
 | 
			
		||||
  size_t nextReadSize = mpsoc::MAX_FLASH_READ_DATA_SIZE;
 | 
			
		||||
  while (readSoFar < flashReadAndWrite.totalReadSize) {
 | 
			
		||||
    if (terminate) {
 | 
			
		||||
      std::filesystem::remove(flashReadAndWrite.obcFile, e);
 | 
			
		||||
      return returnvalue::OK;
 | 
			
		||||
    }
 | 
			
		||||
    nextReadSize = mpsoc::MAX_FLASH_READ_DATA_SIZE;
 | 
			
		||||
    if (flashReadAndWrite.totalReadSize - readSoFar < mpsoc::MAX_FLASH_READ_DATA_SIZE) {
 | 
			
		||||
      nextReadSize = flashReadAndWrite.totalReadSize - readSoFar;
 | 
			
		||||
    }
 | 
			
		||||
    if (ofile.bad() or not ofile.is_open()) {
 | 
			
		||||
      std::filesystem::remove(flashReadAndWrite.obcFile, e);
 | 
			
		||||
      return FILE_READ_ERROR;
 | 
			
		||||
    }
 | 
			
		||||
    mpsoc::TcFlashRead flashReadRequest(spParams, *sequenceCount);
 | 
			
		||||
    result = flashReadRequest.setPayload(nextReadSize);
 | 
			
		||||
    if (result != returnvalue::OK) {
 | 
			
		||||
      std::filesystem::remove(flashReadAndWrite.obcFile, e);
 | 
			
		||||
      return result;
 | 
			
		||||
    }
 | 
			
		||||
    result = flashReadRequest.finishPacket();
 | 
			
		||||
    if (result != returnvalue::OK) {
 | 
			
		||||
      std::filesystem::remove(flashReadAndWrite.obcFile, e);
 | 
			
		||||
      return result;
 | 
			
		||||
    }
 | 
			
		||||
    (*sequenceCount)++;
 | 
			
		||||
    result = handlePacketTransmissionFlashRead(flashReadRequest, ofile, nextReadSize);
 | 
			
		||||
    if (result != returnvalue::OK) {
 | 
			
		||||
      std::filesystem::remove(flashReadAndWrite.obcFile, e);
 | 
			
		||||
      return result;
 | 
			
		||||
    }
 | 
			
		||||
    readSoFar += nextReadSize;
 | 
			
		||||
  }
 | 
			
		||||
  result = flashfclose();
 | 
			
		||||
  if (result != returnvalue::OK) {
 | 
			
		||||
    return result;
 | 
			
		||||
  }
 | 
			
		||||
  return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ReturnValue_t PlocMpsocSpecialComHelperLegacy::flashfopen(uint8_t mode) {
 | 
			
		||||
  spParams.buf = commandBuffer;
 | 
			
		||||
  mpsoc::FlashFopen flashFopen(spParams, *sequenceCount);
 | 
			
		||||
  ReturnValue_t result = flashFopen.setPayload(flashReadAndWrite.mpsocFile, mode);
 | 
			
		||||
  if (result != returnvalue::OK) {
 | 
			
		||||
    return result;
 | 
			
		||||
  }
 | 
			
		||||
  result = flashFopen.finishPacket();
 | 
			
		||||
  if (result != returnvalue::OK) {
 | 
			
		||||
    return result;
 | 
			
		||||
  }
 | 
			
		||||
  (*sequenceCount)++;
 | 
			
		||||
  result = handlePacketTransmissionNoReply(flashFopen);
 | 
			
		||||
  if (result != returnvalue::OK) {
 | 
			
		||||
    return result;
 | 
			
		||||
  }
 | 
			
		||||
  return returnvalue::OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ReturnValue_t PlocMpsocSpecialComHelperLegacy::flashfclose() {
 | 
			
		||||
  spParams.buf = commandBuffer;
 | 
			
		||||
  mpsoc::FlashFclose flashFclose(spParams, *sequenceCount);
 | 
			
		||||
  ReturnValue_t result = flashFclose.finishPacket();
 | 
			
		||||
  if (result != returnvalue::OK) {
 | 
			
		||||
    return result;
 | 
			
		||||
  }
 | 
			
		||||
  (*sequenceCount)++;
 | 
			
		||||
  result = handlePacketTransmissionNoReply(flashFclose);
 | 
			
		||||
  if (result != returnvalue::OK) {
 | 
			
		||||
    return result;
 | 
			
		||||
  }
 | 
			
		||||
  return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ReturnValue_t PlocMpsocSpecialComHelperLegacy::handlePacketTransmissionFlashRead(
 | 
			
		||||
    mpsoc::TcFlashRead& tc, std::ofstream& ofile, size_t expectedReadLen) {
 | 
			
		||||
  ReturnValue_t result = sendCommand(tc);
 | 
			
		||||
  if (result != returnvalue::OK) {
 | 
			
		||||
    return result;
 | 
			
		||||
  }
 | 
			
		||||
  result = handleAck();
 | 
			
		||||
  if (result != returnvalue::OK) {
 | 
			
		||||
    return result;
 | 
			
		||||
  }
 | 
			
		||||
  result = handleTmReception();
 | 
			
		||||
  if (result != returnvalue::OK) {
 | 
			
		||||
    return result;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // We have the nominal case where the flash read report appears first, or the case where we
 | 
			
		||||
  // get an EXE failure immediately.
 | 
			
		||||
  if (spReader.getApid() == mpsoc::apid::TM_FLASH_READ_REPORT) {
 | 
			
		||||
    result = handleFlashReadReply(ofile, expectedReadLen);
 | 
			
		||||
    if (result != returnvalue::OK) {
 | 
			
		||||
      return result;
 | 
			
		||||
    }
 | 
			
		||||
    return handleExe();
 | 
			
		||||
  } else if (spReader.getApid() == mpsoc::apid::EXE_FAILURE) {
 | 
			
		||||
    handleExeFailure();
 | 
			
		||||
  } else {
 | 
			
		||||
    triggerEvent(MPSOC_EXE_INVALID_APID, spReader.getApid(), static_cast<uint32_t>(internalState));
 | 
			
		||||
    sif::warning << "PLOC MPSoC: Expected execution report "
 | 
			
		||||
                 << "but received space packet with apid " << std::hex << spReader.getApid()
 | 
			
		||||
                 << std::endl;
 | 
			
		||||
  }
 | 
			
		||||
  return returnvalue::FAILED;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ReturnValue_t PlocMpsocSpecialComHelperLegacy::handlePacketTransmissionNoReply(ploc::SpTcBase& tc) {
 | 
			
		||||
  ReturnValue_t result = sendCommand(tc);
 | 
			
		||||
  if (result != returnvalue::OK) {
 | 
			
		||||
    return result;
 | 
			
		||||
  }
 | 
			
		||||
  result = handleAck();
 | 
			
		||||
  if (result != returnvalue::OK) {
 | 
			
		||||
    return result;
 | 
			
		||||
  }
 | 
			
		||||
  return handleExe();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ReturnValue_t PlocMpsocSpecialComHelperLegacy::sendCommand(ploc::SpTcBase& tc) {
 | 
			
		||||
  ReturnValue_t result = returnvalue::OK;
 | 
			
		||||
  result = uartComIF->sendMessage(comCookie, tc.getFullPacket(), tc.getFullPacketLen());
 | 
			
		||||
  if (result != returnvalue::OK) {
 | 
			
		||||
    sif::warning << "PlocMPSoCHelper::sendCommand: Failed to send command" << std::endl;
 | 
			
		||||
    triggerEvent(MPSOC_SENDING_COMMAND_FAILED, result, static_cast<uint32_t>(internalState));
 | 
			
		||||
    return result;
 | 
			
		||||
  }
 | 
			
		||||
  return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ReturnValue_t PlocMpsocSpecialComHelperLegacy::handleAck() {
 | 
			
		||||
  ReturnValue_t result = returnvalue::OK;
 | 
			
		||||
  result = handleTmReception();
 | 
			
		||||
  if (result != returnvalue::OK) {
 | 
			
		||||
    return result;
 | 
			
		||||
  }
 | 
			
		||||
  result = checkReceivedTm();
 | 
			
		||||
  if (result != returnvalue::OK) {
 | 
			
		||||
    return result;
 | 
			
		||||
  }
 | 
			
		||||
  uint16_t apid = spReader.getApid();
 | 
			
		||||
  if (apid != mpsoc::apid::ACK_SUCCESS) {
 | 
			
		||||
    handleAckApidFailure(spReader);
 | 
			
		||||
    return returnvalue::FAILED;
 | 
			
		||||
  }
 | 
			
		||||
  return returnvalue::OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void PlocMpsocSpecialComHelperLegacy::handleAckApidFailure(const ploc::SpTmReader& reader) {
 | 
			
		||||
  uint16_t apid = reader.getApid();
 | 
			
		||||
  if (apid == mpsoc::apid::ACK_FAILURE) {
 | 
			
		||||
    uint16_t status = mpsoc::getStatusFromRawData(reader.getFullData());
 | 
			
		||||
    sif::warning << "PLOC MPSoC ACK Failure: " << mpsoc::getStatusString(status) << std::endl;
 | 
			
		||||
    triggerEvent(MPSOC_ACK_FAILURE_REPORT, static_cast<uint32_t>(internalState), status);
 | 
			
		||||
  } else {
 | 
			
		||||
    triggerEvent(MPSOC_ACK_INVALID_APID, apid, static_cast<uint32_t>(internalState));
 | 
			
		||||
    sif::warning << "PlocMPSoCHelper::handleAckApidFailure: Expected acknowledgement report "
 | 
			
		||||
                 << "but received space packet with apid " << std::hex << apid << std::endl;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ReturnValue_t PlocMpsocSpecialComHelperLegacy::handleExe() {
 | 
			
		||||
  ReturnValue_t result = returnvalue::OK;
 | 
			
		||||
 | 
			
		||||
  result = handleTmReception();
 | 
			
		||||
  if (result != returnvalue::OK) {
 | 
			
		||||
    return result;
 | 
			
		||||
  }
 | 
			
		||||
  result = checkReceivedTm();
 | 
			
		||||
  if (result != returnvalue::OK) {
 | 
			
		||||
    return result;
 | 
			
		||||
  }
 | 
			
		||||
  uint16_t apid = spReader.getApid();
 | 
			
		||||
  if (apid == mpsoc::apid::EXE_FAILURE) {
 | 
			
		||||
    handleExeFailure();
 | 
			
		||||
    return returnvalue::FAILED;
 | 
			
		||||
  } else if (apid != mpsoc::apid::EXE_SUCCESS) {
 | 
			
		||||
    triggerEvent(MPSOC_EXE_INVALID_APID, apid, static_cast<uint32_t>(internalState));
 | 
			
		||||
    sif::warning << "PLOC MPSoC: Expected execution report "
 | 
			
		||||
                 << "but received space packet with apid " << std::hex << apid << std::endl;
 | 
			
		||||
  }
 | 
			
		||||
  return returnvalue::OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void PlocMpsocSpecialComHelperLegacy::handleExeFailure() {
 | 
			
		||||
  uint16_t status = mpsoc::getStatusFromRawData(spReader.getFullData());
 | 
			
		||||
  sif::warning << "PLOC MPSoC EXE Failure: " << mpsoc::getStatusString(status) << std::endl;
 | 
			
		||||
  triggerEvent(MPSOC_EXE_FAILURE_REPORT, static_cast<uint32_t>(internalState));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ReturnValue_t PlocMpsocSpecialComHelperLegacy::handleTmReception() {
 | 
			
		||||
  ReturnValue_t result = returnvalue::OK;
 | 
			
		||||
  tmCountdown.resetTimer();
 | 
			
		||||
  size_t readBytes = 0;
 | 
			
		||||
  size_t currentBytes = 0;
 | 
			
		||||
  uint32_t usleepDelay = 5;
 | 
			
		||||
  size_t fullPacketLen = 0;
 | 
			
		||||
  while (true) {
 | 
			
		||||
    if (tmCountdown.hasTimedOut()) {
 | 
			
		||||
      triggerEvent(MPSOC_READ_TIMEOUT, tmCountdown.getTimeoutMs());
 | 
			
		||||
      return returnvalue::FAILED;
 | 
			
		||||
    }
 | 
			
		||||
    result = receive(tmBuf.data() + readBytes, 6, ¤tBytes);
 | 
			
		||||
    if (result != returnvalue::OK) {
 | 
			
		||||
      return result;
 | 
			
		||||
    }
 | 
			
		||||
    spReader.setReadOnlyData(tmBuf.data(), tmBuf.size());
 | 
			
		||||
    fullPacketLen = spReader.getFullPacketLen();
 | 
			
		||||
    readBytes += currentBytes;
 | 
			
		||||
    if (readBytes == 6) {
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
    usleep(usleepDelay);
 | 
			
		||||
    if (usleepDelay < 200000) {
 | 
			
		||||
      usleepDelay *= 4;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  while (true) {
 | 
			
		||||
    if (tmCountdown.hasTimedOut()) {
 | 
			
		||||
      triggerEvent(MPSOC_READ_TIMEOUT, tmCountdown.getTimeoutMs());
 | 
			
		||||
      return returnvalue::FAILED;
 | 
			
		||||
    }
 | 
			
		||||
    result = receive(tmBuf.data() + readBytes, fullPacketLen - readBytes, ¤tBytes);
 | 
			
		||||
    readBytes += currentBytes;
 | 
			
		||||
    if (fullPacketLen == readBytes) {
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
    usleep(usleepDelay);
 | 
			
		||||
    if (usleepDelay < 200000) {
 | 
			
		||||
      usleepDelay *= 4;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  // arrayprinter::print(tmBuf.data(), readBytes);
 | 
			
		||||
  return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ReturnValue_t PlocMpsocSpecialComHelperLegacy::handleFlashReadReply(std::ofstream& ofile,
 | 
			
		||||
                                                                    size_t expectedReadLen) {
 | 
			
		||||
  ReturnValue_t result = checkReceivedTm();
 | 
			
		||||
  if (result != returnvalue::OK) {
 | 
			
		||||
    return result;
 | 
			
		||||
  }
 | 
			
		||||
  uint16_t apid = spReader.getApid();
 | 
			
		||||
  if (apid != mpsoc::apid::TM_FLASH_READ_REPORT) {
 | 
			
		||||
    triggerEvent(MPSOC_FLASH_READ_PACKET_ERROR, FlashReadErrorType::FLASH_READ_APID_ERROR);
 | 
			
		||||
    sif::warning << "PLOC MPSoC Flash Read: Unexpected APID" << std::endl;
 | 
			
		||||
    return result;
 | 
			
		||||
  }
 | 
			
		||||
  const uint8_t* packetData = spReader.getPacketData();
 | 
			
		||||
  size_t deserDummy = spReader.getPacketDataLen() - mpsoc::CRC_SIZE;
 | 
			
		||||
  uint32_t receivedReadLen = 0;
 | 
			
		||||
  // I think this is buggy, weird stuff in the short name field.
 | 
			
		||||
  //  std::string receivedShortName = std::string(reinterpret_cast<const char*>(packetData), 12);
 | 
			
		||||
  //  if (receivedShortName != flashReadAndWrite.mpsocFile.substr(0, 11)) {
 | 
			
		||||
  //    sif::warning << "PLOC MPSoC Flash Read: Missmatch between request file name and "
 | 
			
		||||
  //                    "received file name"
 | 
			
		||||
  //                 << std::endl;
 | 
			
		||||
  //    triggerEvent(MPSOC_FLASH_READ_PACKET_ERROR, FlashReadErrorType::FLASH_READ_FILENAME_ERROR);
 | 
			
		||||
  //    return returnvalue::FAILED;
 | 
			
		||||
  //  }
 | 
			
		||||
  packetData += 12;
 | 
			
		||||
  result = SerializeAdapter::deSerialize(&receivedReadLen, &packetData, &deserDummy,
 | 
			
		||||
                                         SerializeIF::Endianness::NETWORK);
 | 
			
		||||
  if (result != returnvalue::OK) {
 | 
			
		||||
    return result;
 | 
			
		||||
  }
 | 
			
		||||
  if (receivedReadLen != expectedReadLen) {
 | 
			
		||||
    sif::warning << "PLOC MPSoC Flash Read: Missmatch between request read length and "
 | 
			
		||||
                    "received read length"
 | 
			
		||||
                 << std::endl;
 | 
			
		||||
    triggerEvent(MPSOC_FLASH_READ_PACKET_ERROR, FlashReadErrorType::FLASH_READ_READLEN_ERROR);
 | 
			
		||||
    return returnvalue::FAILED;
 | 
			
		||||
  }
 | 
			
		||||
  ofile.write(reinterpret_cast<const char*>(packetData), receivedReadLen);
 | 
			
		||||
  return returnvalue::OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ReturnValue_t PlocMpsocSpecialComHelperLegacy::fileCheck(std::string obcFile) {
 | 
			
		||||
#ifdef XIPHOS_Q7S
 | 
			
		||||
  ReturnValue_t result = FilesystemHelper::checkPath(obcFile);
 | 
			
		||||
  if (result != returnvalue::OK) {
 | 
			
		||||
    return result;
 | 
			
		||||
  }
 | 
			
		||||
#elif defined(TE0720_1CFA)
 | 
			
		||||
  if (not std::filesystem::exists(obcFile)) {
 | 
			
		||||
    sif::warning << "PlocMPSoCHelper::startFlashWrite: File " << obcFile << "does not exist"
 | 
			
		||||
                 << std::endl;
 | 
			
		||||
    return returnvalue::FAILED;
 | 
			
		||||
  }
 | 
			
		||||
#endif
 | 
			
		||||
  return returnvalue::OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ReturnValue_t PlocMpsocSpecialComHelperLegacy::startFlashReadOrWriteBase(std::string obcFile,
 | 
			
		||||
                                                                         std::string mpsocFile) {
 | 
			
		||||
  ReturnValue_t result = fileCheck(obcFile);
 | 
			
		||||
  if (result != returnvalue::OK) {
 | 
			
		||||
    return result;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  flashReadAndWrite.obcFile = std::move(obcFile);
 | 
			
		||||
  flashReadAndWrite.mpsocFile = std::move(mpsocFile);
 | 
			
		||||
  resetHelper();
 | 
			
		||||
  return returnvalue::OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ReturnValue_t PlocMpsocSpecialComHelperLegacy::checkReceivedTm() {
 | 
			
		||||
  ReturnValue_t result = spReader.checkSize();
 | 
			
		||||
  if (result != returnvalue::OK) {
 | 
			
		||||
    sif::error << "PLOC MPSoC: Size check on received TM failed" << std::endl;
 | 
			
		||||
    triggerEvent(MPSOC_TM_SIZE_ERROR);
 | 
			
		||||
    return result;
 | 
			
		||||
  }
 | 
			
		||||
  result = spReader.checkCrc();
 | 
			
		||||
  if (result != returnvalue::OK) {
 | 
			
		||||
    sif::warning << "PLOC MPSoC: CRC check failed" << std::endl;
 | 
			
		||||
    triggerEvent(MPSOC_TM_CRC_MISSMATCH, *sequenceCount);
 | 
			
		||||
    return result;
 | 
			
		||||
  }
 | 
			
		||||
  uint16_t recvSeqCnt = spReader.getSequenceCount();
 | 
			
		||||
  if (recvSeqCnt != *sequenceCount) {
 | 
			
		||||
    triggerEvent(MPSOC_HELPER_SEQ_CNT_MISMATCH, *sequenceCount, recvSeqCnt);
 | 
			
		||||
    *sequenceCount = recvSeqCnt;
 | 
			
		||||
  }
 | 
			
		||||
  // This sequence count ping pong does not make any sense but it is how the MPSoC expects it.
 | 
			
		||||
  (*sequenceCount)++;
 | 
			
		||||
  return returnvalue::OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ReturnValue_t PlocMpsocSpecialComHelperLegacy::receive(uint8_t* data, size_t requestBytes,
 | 
			
		||||
                                                       size_t* readBytes) {
 | 
			
		||||
  ReturnValue_t result = returnvalue::OK;
 | 
			
		||||
  uint8_t* buffer = nullptr;
 | 
			
		||||
  result = uartComIF->requestReceiveMessage(comCookie, requestBytes);
 | 
			
		||||
  if (result != returnvalue::OK) {
 | 
			
		||||
    sif::warning << "PlocMPSoCHelper::receive: Failed to request reply" << std::endl;
 | 
			
		||||
    triggerEvent(MPSOC_HELPER_REQUESTING_REPLY_FAILED, result,
 | 
			
		||||
                 static_cast<uint32_t>(static_cast<uint32_t>(internalState)));
 | 
			
		||||
    return returnvalue::FAILED;
 | 
			
		||||
  }
 | 
			
		||||
  result = uartComIF->readReceivedMessage(comCookie, &buffer, readBytes);
 | 
			
		||||
  if (result != returnvalue::OK) {
 | 
			
		||||
    sif::warning << "PlocMPSoCHelper::receive: Failed to read received message" << std::endl;
 | 
			
		||||
    triggerEvent(MPSOC_HELPER_READING_REPLY_FAILED, result, static_cast<uint32_t>(internalState));
 | 
			
		||||
    return returnvalue::FAILED;
 | 
			
		||||
  }
 | 
			
		||||
  if (*readBytes > 0) {
 | 
			
		||||
    std::memcpy(data, buffer, *readBytes);
 | 
			
		||||
  }
 | 
			
		||||
  return result;
 | 
			
		||||
}
 | 
			
		||||
@@ -1,200 +0,0 @@
 | 
			
		||||
#ifndef BSP_Q7S_DEVICES_PLOCMPSOCHELPER_H_
 | 
			
		||||
#define BSP_Q7S_DEVICES_PLOCMPSOCHELPER_H_
 | 
			
		||||
 | 
			
		||||
#include <linux/payload/plocMpsocHelpers.h>
 | 
			
		||||
#include <mission/utility/trace.h>
 | 
			
		||||
 | 
			
		||||
#include <string>
 | 
			
		||||
 | 
			
		||||
#include "OBSWConfig.h"
 | 
			
		||||
#include "fsfw/devicehandlers/CookieIF.h"
 | 
			
		||||
#include "fsfw/objectmanager/SystemObject.h"
 | 
			
		||||
#include "fsfw/osal/linux/BinarySemaphore.h"
 | 
			
		||||
#include "fsfw/returnvalues/returnvalue.h"
 | 
			
		||||
#include "fsfw/tasks/ExecutableObjectIF.h"
 | 
			
		||||
#include "fsfw/tmtcservices/SourceSequenceCounter.h"
 | 
			
		||||
#include "fsfw_hal/linux/serial/SerialComIF.h"
 | 
			
		||||
#ifdef XIPHOS_Q7S
 | 
			
		||||
#include "bsp_q7s/fs/SdCardManager.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @brief   Helper class for MPSoC of PLOC intended to accelerate large data transfers between
 | 
			
		||||
 *          MPSoC and OBC.
 | 
			
		||||
 * @author  J. Meier
 | 
			
		||||
 */
 | 
			
		||||
class PlocMpsocSpecialComHelperLegacy : public SystemObject, public ExecutableObjectIF {
 | 
			
		||||
 public:
 | 
			
		||||
  static const uint8_t SUBSYSTEM_ID = SUBSYSTEM_ID::PLOC_MPSOC_HELPER;
 | 
			
		||||
 | 
			
		||||
  //! [EXPORT] : [COMMENT] Flash write fails
 | 
			
		||||
  static const Event MPSOC_FLASH_WRITE_FAILED = MAKE_EVENT(0, severity::LOW);
 | 
			
		||||
  //! [EXPORT] : [COMMENT] Flash write successful
 | 
			
		||||
  static const Event MPSOC_FLASH_WRITE_SUCCESSFUL = MAKE_EVENT(1, severity::INFO);
 | 
			
		||||
  //! [EXPORT] : [COMMENT] Communication interface returned failure when trying to send the command
 | 
			
		||||
  //! to the MPSoC
 | 
			
		||||
  //! P1: Return value returned by the communication interface sendMessage function
 | 
			
		||||
  //! P2: Internal state of MPSoC helper
 | 
			
		||||
  static const Event MPSOC_SENDING_COMMAND_FAILED = MAKE_EVENT(2, severity::LOW);
 | 
			
		||||
  //! [EXPORT] : [COMMENT] Request receive message of communication interface failed
 | 
			
		||||
  //! P1: Return value returned by the communication interface requestReceiveMessage function
 | 
			
		||||
  //! P2: Internal state of MPSoC helper
 | 
			
		||||
  static const Event MPSOC_HELPER_REQUESTING_REPLY_FAILED = MAKE_EVENT(3, severity::LOW);
 | 
			
		||||
  //! [EXPORT] : [COMMENT] Reading receive message of communication interface failed
 | 
			
		||||
  //! P1: Return value returned by the communication interface readingReceivedMessage function
 | 
			
		||||
  //! P2: Internal state of MPSoC helper
 | 
			
		||||
  static const Event MPSOC_HELPER_READING_REPLY_FAILED = MAKE_EVENT(4, severity::LOW);
 | 
			
		||||
  //! [EXPORT] : [COMMENT] Did not receive acknowledgment report
 | 
			
		||||
  //! P1: Number of bytes missing
 | 
			
		||||
  //! P2: Internal state of MPSoC helper
 | 
			
		||||
  static const Event MPSOC_MISSING_ACK = MAKE_EVENT(5, severity::LOW);
 | 
			
		||||
  //! [EXPORT] : [COMMENT] Did not receive execution report
 | 
			
		||||
  //! P1: Number of bytes missing
 | 
			
		||||
  //! P2: Internal state of MPSoC helper
 | 
			
		||||
  static const Event MPSOC_MISSING_EXE = MAKE_EVENT(6, severity::LOW);
 | 
			
		||||
  //! [EXPORT] : [COMMENT] Received acknowledgment failure report
 | 
			
		||||
  //! P1: Internal state of MPSoC
 | 
			
		||||
  static const Event MPSOC_ACK_FAILURE_REPORT = MAKE_EVENT(7, severity::LOW);
 | 
			
		||||
  //! [EXPORT] : [COMMENT] Received execution failure report
 | 
			
		||||
  //! P1: Internal state of MPSoC
 | 
			
		||||
  static const Event MPSOC_EXE_FAILURE_REPORT = MAKE_EVENT(8, severity::LOW);
 | 
			
		||||
  //! [EXPORT] : [COMMENT] Expected acknowledgment report but received space packet with other apid
 | 
			
		||||
  //! P1: Apid of received space packet
 | 
			
		||||
  //! P2: Internal state of MPSoC
 | 
			
		||||
  static const Event MPSOC_ACK_INVALID_APID = MAKE_EVENT(9, severity::LOW);
 | 
			
		||||
  //! [EXPORT] : [COMMENT] Expected execution report but received space packet with other apid
 | 
			
		||||
  //! P1: Apid of received space packet
 | 
			
		||||
  //! P2: Internal state of MPSoC
 | 
			
		||||
  static const Event MPSOC_EXE_INVALID_APID = MAKE_EVENT(10, severity::LOW);
 | 
			
		||||
  //! [EXPORT] : [COMMENT] Received sequence count does not match expected sequence count
 | 
			
		||||
  //! P1: Expected sequence count
 | 
			
		||||
  //! P2: Received sequence count
 | 
			
		||||
  static const Event MPSOC_HELPER_SEQ_CNT_MISMATCH = MAKE_EVENT(11, severity::LOW);
 | 
			
		||||
  static const Event MPSOC_TM_SIZE_ERROR = MAKE_EVENT(12, severity::LOW);
 | 
			
		||||
  static const Event MPSOC_TM_CRC_MISSMATCH = MAKE_EVENT(13, severity::LOW);
 | 
			
		||||
  static const Event MPSOC_FLASH_READ_PACKET_ERROR = MAKE_EVENT(14, severity::LOW);
 | 
			
		||||
  static const Event MPSOC_FLASH_READ_FAILED = MAKE_EVENT(15, severity::LOW);
 | 
			
		||||
  static const Event MPSOC_FLASH_READ_SUCCESSFUL = MAKE_EVENT(16, severity::INFO);
 | 
			
		||||
  static const Event MPSOC_READ_TIMEOUT = MAKE_EVENT(17, severity::LOW);
 | 
			
		||||
 | 
			
		||||
  enum FlashReadErrorType : uint32_t {
 | 
			
		||||
    FLASH_READ_APID_ERROR = 0,
 | 
			
		||||
    FLASH_READ_FILENAME_ERROR = 1,
 | 
			
		||||
    FLASH_READ_READLEN_ERROR = 2
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  PlocMpsocSpecialComHelperLegacy(object_id_t objectId);
 | 
			
		||||
  virtual ~PlocMpsocSpecialComHelperLegacy();
 | 
			
		||||
 | 
			
		||||
  ReturnValue_t initialize() override;
 | 
			
		||||
  ReturnValue_t performOperation(uint8_t operationCode = 0) override;
 | 
			
		||||
 | 
			
		||||
  ReturnValue_t setComIF(DeviceCommunicationIF* communicationInterface_);
 | 
			
		||||
  void setComCookie(CookieIF* comCookie_);
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @brief   Starts flash write sequence
 | 
			
		||||
   *
 | 
			
		||||
   * @param obcFile   File where to read from the data
 | 
			
		||||
   * @param mpsocFile The file of the MPSoC where should be written to
 | 
			
		||||
   *
 | 
			
		||||
   * @return  returnvalue::OK if successful, otherwise error return value
 | 
			
		||||
   */
 | 
			
		||||
  ReturnValue_t startFlashWrite(std::string obcFile, std::string mpsocFile);
 | 
			
		||||
  /**
 | 
			
		||||
   *
 | 
			
		||||
   * @param obcFile Full target file name on OBC
 | 
			
		||||
   * @param mpsocFile The file on the MPSoC which should be copied ot the OBC
 | 
			
		||||
   * @param readFileSize The size of the file on the MPSoC.
 | 
			
		||||
   * @return
 | 
			
		||||
   */
 | 
			
		||||
  ReturnValue_t startFlashRead(std::string obcFile, std::string mpsocFile, size_t readFileSize);
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @brief   Can be used to interrupt a running data transfer.
 | 
			
		||||
   */
 | 
			
		||||
  void stopProcess();
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @brief   Sets the sequence count object responsible for the sequence count handling
 | 
			
		||||
   */
 | 
			
		||||
  void setSequenceCount(SourceSequenceCounter* sequenceCount_);
 | 
			
		||||
 | 
			
		||||
 private:
 | 
			
		||||
  static const uint8_t INTERFACE_ID = CLASS_ID::PLOC_MPSOC_HELPER;
 | 
			
		||||
 | 
			
		||||
  //! [EXPORT] : [COMMENT] File error occured for file transfers from OBC to the MPSoC.
 | 
			
		||||
  static const ReturnValue_t FILE_WRITE_ERROR = MAKE_RETURN_CODE(0xA0);
 | 
			
		||||
  //! [EXPORT] : [COMMENT] File error occured for file transfers from MPSoC to OBC.
 | 
			
		||||
  static const ReturnValue_t FILE_READ_ERROR = MAKE_RETURN_CODE(0xA1);
 | 
			
		||||
 | 
			
		||||
  // Maximum number of times the communication interface retries polling data from the reply
 | 
			
		||||
  // buffer
 | 
			
		||||
  static const int RETRIES = 10000;
 | 
			
		||||
 | 
			
		||||
  struct FlashInfo {
 | 
			
		||||
    std::string obcFile;
 | 
			
		||||
    std::string mpsocFile;
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  struct FlashRead : public FlashInfo {
 | 
			
		||||
    size_t totalReadSize = 0;
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  struct FlashRead flashReadAndWrite;
 | 
			
		||||
#if OBSW_THREAD_TRACING == 1
 | 
			
		||||
  uint32_t opCounter = 0;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  enum class InternalState { IDLE, FLASH_WRITE, FLASH_READ };
 | 
			
		||||
 | 
			
		||||
  InternalState internalState = InternalState::IDLE;
 | 
			
		||||
 | 
			
		||||
  BinarySemaphore semaphore;
 | 
			
		||||
#ifdef XIPHOS_Q7S
 | 
			
		||||
  SdCardManager* sdcMan = nullptr;
 | 
			
		||||
#endif
 | 
			
		||||
  uint8_t commandBuffer[mpsoc::MAX_COMMAND_SIZE];
 | 
			
		||||
  SpacePacketCreator creator;
 | 
			
		||||
  ploc::SpTcParams spParams = ploc::SpTcParams(creator);
 | 
			
		||||
 | 
			
		||||
  Countdown tmCountdown = Countdown(5000);
 | 
			
		||||
 | 
			
		||||
  std::array<uint8_t, mpsoc::SP_MAX_DATA_SIZE> fileBuf{};
 | 
			
		||||
  std::array<uint8_t, mpsoc::MAX_REPLY_SIZE> tmBuf{};
 | 
			
		||||
 | 
			
		||||
  bool terminate = false;
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Communication interface of MPSoC responsible for low level access. Must be set by the
 | 
			
		||||
   * MPSoC Handler.
 | 
			
		||||
   */
 | 
			
		||||
  SerialComIF* uartComIF = nullptr;
 | 
			
		||||
  // Communication cookie. Must be set by the MPSoC Handler
 | 
			
		||||
  CookieIF* comCookie = nullptr;
 | 
			
		||||
  // Sequence count, must be set by Ploc MPSoC Handler
 | 
			
		||||
  SourceSequenceCounter* sequenceCount = nullptr;
 | 
			
		||||
  ploc::SpTmReader spReader;
 | 
			
		||||
 | 
			
		||||
  void resetHelper();
 | 
			
		||||
  ReturnValue_t performFlashWrite();
 | 
			
		||||
  ReturnValue_t performFlashRead();
 | 
			
		||||
  ReturnValue_t flashfopen(uint8_t accessMode);
 | 
			
		||||
  ReturnValue_t flashfclose();
 | 
			
		||||
  ReturnValue_t handlePacketTransmissionNoReply(ploc::SpTcBase& tc);
 | 
			
		||||
  ReturnValue_t handlePacketTransmissionFlashRead(mpsoc::TcFlashRead& tc, std::ofstream& ofile,
 | 
			
		||||
                                                  size_t expectedReadLen);
 | 
			
		||||
  ReturnValue_t handleFlashReadReply(std::ofstream& ofile, size_t expectedReadLen);
 | 
			
		||||
  ReturnValue_t sendCommand(ploc::SpTcBase& tc);
 | 
			
		||||
  ReturnValue_t receive(uint8_t* data, size_t requestBytes, size_t* readBytes);
 | 
			
		||||
  ReturnValue_t handleAck();
 | 
			
		||||
  ReturnValue_t handleExe();
 | 
			
		||||
  ReturnValue_t startFlashReadOrWriteBase(std::string obcFile, std::string mpsocFile);
 | 
			
		||||
  ReturnValue_t fileCheck(std::string obcFile);
 | 
			
		||||
  void handleAckApidFailure(const ploc::SpTmReader& reader);
 | 
			
		||||
  void handleExeFailure();
 | 
			
		||||
  ReturnValue_t handleTmReception();
 | 
			
		||||
  ReturnValue_t checkReceivedTm();
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif /* BSP_Q7S_DEVICES_PLOCMPSOCHELPER_H_ */
 | 
			
		||||
@@ -48,7 +48,6 @@
 | 
			
		||||
#define OBSW_SWITCH_TO_NORMAL_MODE_AFTER_STARTUP    1
 | 
			
		||||
#define OBSW_PRINT_MISSED_DEADLINES                 1
 | 
			
		||||
 | 
			
		||||
#define OBSW_MPSOC_JTAG_BOOT                        0
 | 
			
		||||
#define OBSW_SYRLINKS_SIMULATED                     1
 | 
			
		||||
#define OBSW_ADD_TEST_CODE                          0
 | 
			
		||||
#define OBSW_ADD_TEST_TASK                          0
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
/**
 | 
			
		||||
 * @brief    Auto-generated event translation file. Contains 325 translations.
 | 
			
		||||
 * @brief    Auto-generated event translation file. Contains 315 translations.
 | 
			
		||||
 * @details
 | 
			
		||||
 * Generated on: 2024-05-06 13:47:38
 | 
			
		||||
 * Generated on: 2023-10-27 14:24:05
 | 
			
		||||
 */
 | 
			
		||||
#include "translateEvents.h"
 | 
			
		||||
 | 
			
		||||
@@ -82,11 +82,8 @@ const char *BIT_LOCK_STRING = "BIT_LOCK";
 | 
			
		||||
const char *BIT_LOCK_LOST_STRING = "BIT_LOCK_LOST";
 | 
			
		||||
const char *FRAME_PROCESSING_FAILED_STRING = "FRAME_PROCESSING_FAILED";
 | 
			
		||||
const char *CLOCK_SET_STRING = "CLOCK_SET";
 | 
			
		||||
const char *CLOCK_DUMP_LEGACY_STRING = "CLOCK_DUMP_LEGACY";
 | 
			
		||||
const char *CLOCK_SET_FAILURE_STRING = "CLOCK_SET_FAILURE";
 | 
			
		||||
const char *CLOCK_DUMP_STRING = "CLOCK_DUMP";
 | 
			
		||||
const char *CLOCK_DUMP_BEFORE_SETTING_TIME_STRING = "CLOCK_DUMP_BEFORE_SETTING_TIME";
 | 
			
		||||
const char *CLOCK_DUMP_AFTER_SETTING_TIME_STRING = "CLOCK_DUMP_AFTER_SETTING_TIME";
 | 
			
		||||
const char *CLOCK_SET_FAILURE_STRING = "CLOCK_SET_FAILURE";
 | 
			
		||||
const char *TC_DELETION_FAILED_STRING = "TC_DELETION_FAILED";
 | 
			
		||||
const char *TEST_STRING = "TEST";
 | 
			
		||||
const char *CHANGE_OF_SETUP_PARAMETER_STRING = "CHANGE_OF_SETUP_PARAMETER";
 | 
			
		||||
@@ -97,17 +94,14 @@ const char *FILESTORE_ERROR_STRING = "FILESTORE_ERROR";
 | 
			
		||||
const char *FILENAME_TOO_LARGE_ERROR_STRING = "FILENAME_TOO_LARGE_ERROR";
 | 
			
		||||
const char *HANDLING_CFDP_REQUEST_FAILED_STRING = "HANDLING_CFDP_REQUEST_FAILED";
 | 
			
		||||
const char *SAFE_RATE_VIOLATION_STRING = "SAFE_RATE_VIOLATION";
 | 
			
		||||
const char *RATE_RECOVERY_STRING = "RATE_RECOVERY";
 | 
			
		||||
const char *SAFE_RATE_RECOVERY_STRING = "SAFE_RATE_RECOVERY";
 | 
			
		||||
const char *MULTIPLE_RW_INVALID_STRING = "MULTIPLE_RW_INVALID";
 | 
			
		||||
const char *MEKF_INVALID_INFO_STRING = "MEKF_INVALID_INFO";
 | 
			
		||||
const char *MEKF_RECOVERY_STRING = "MEKF_RECOVERY";
 | 
			
		||||
const char *MEKF_AUTOMATIC_RESET_STRING = "MEKF_AUTOMATIC_RESET";
 | 
			
		||||
const char *PTG_CTRL_NO_ATTITUDE_INFORMATION_STRING = "PTG_CTRL_NO_ATTITUDE_INFORMATION";
 | 
			
		||||
const char *MEKF_INVALID_MODE_VIOLATION_STRING = "MEKF_INVALID_MODE_VIOLATION";
 | 
			
		||||
const char *SAFE_MODE_CONTROLLER_FAILURE_STRING = "SAFE_MODE_CONTROLLER_FAILURE";
 | 
			
		||||
const char *TLE_TOO_OLD_STRING = "TLE_TOO_OLD";
 | 
			
		||||
const char *TLE_FILE_READ_FAILED_STRING = "TLE_FILE_READ_FAILED";
 | 
			
		||||
const char *PTG_RATE_VIOLATION_STRING = "PTG_RATE_VIOLATION";
 | 
			
		||||
const char *DETUMBLE_TRANSITION_FAILED_STRING = "DETUMBLE_TRANSITION_FAILED";
 | 
			
		||||
const char *SWITCH_CMD_SENT_STRING = "SWITCH_CMD_SENT";
 | 
			
		||||
const char *SWITCH_HAS_CHANGED_STRING = "SWITCH_HAS_CHANGED";
 | 
			
		||||
const char *SWITCHING_Q7S_DENIED_STRING = "SWITCHING_Q7S_DENIED";
 | 
			
		||||
@@ -142,7 +136,6 @@ const char *MPSOC_HANDLER_SEQUENCE_COUNT_MISMATCH_STRING = "MPSOC_HANDLER_SEQUEN
 | 
			
		||||
const char *MPSOC_SHUTDOWN_FAILED_STRING = "MPSOC_SHUTDOWN_FAILED";
 | 
			
		||||
const char *SUPV_NOT_ON_STRING = "SUPV_NOT_ON";
 | 
			
		||||
const char *SUPV_REPLY_TIMEOUT_STRING = "SUPV_REPLY_TIMEOUT";
 | 
			
		||||
const char *CAM_MUST_BE_ON_FOR_SNAPSHOT_MODE_STRING = "CAM_MUST_BE_ON_FOR_SNAPSHOT_MODE";
 | 
			
		||||
const char *SELF_TEST_I2C_FAILURE_STRING = "SELF_TEST_I2C_FAILURE";
 | 
			
		||||
const char *SELF_TEST_SPI_FAILURE_STRING = "SELF_TEST_SPI_FAILURE";
 | 
			
		||||
const char *SELF_TEST_ADC_FAILURE_STRING = "SELF_TEST_ADC_FAILURE";
 | 
			
		||||
@@ -164,8 +157,6 @@ const char *SUPV_EXE_FAILURE_STRING = "SUPV_EXE_FAILURE";
 | 
			
		||||
const char *SUPV_CRC_FAILURE_EVENT_STRING = "SUPV_CRC_FAILURE_EVENT";
 | 
			
		||||
const char *SUPV_HELPER_EXECUTING_STRING = "SUPV_HELPER_EXECUTING";
 | 
			
		||||
const char *SUPV_MPSOC_SHUTDOWN_BUILD_FAILED_STRING = "SUPV_MPSOC_SHUTDOWN_BUILD_FAILED";
 | 
			
		||||
const char *SUPV_ACK_UNKNOWN_COMMAND_STRING = "SUPV_ACK_UNKNOWN_COMMAND";
 | 
			
		||||
const char *SUPV_EXE_ACK_UNKNOWN_COMMAND_STRING = "SUPV_EXE_ACK_UNKNOWN_COMMAND";
 | 
			
		||||
const char *SANITIZATION_FAILED_STRING = "SANITIZATION_FAILED";
 | 
			
		||||
const char *MOUNTED_SD_CARD_STRING = "MOUNTED_SD_CARD";
 | 
			
		||||
const char *SEND_MRAM_DUMP_FAILED_STRING = "SEND_MRAM_DUMP_FAILED";
 | 
			
		||||
@@ -245,7 +236,6 @@ const char *SIDE_SWITCH_TRANSITION_NOT_ALLOWED_12903_STRING = "SIDE_SWITCH_TRANS
 | 
			
		||||
const char *CHILDREN_LOST_MODE_STRING = "CHILDREN_LOST_MODE";
 | 
			
		||||
const char *GPS_FIX_CHANGE_STRING = "GPS_FIX_CHANGE";
 | 
			
		||||
const char *CANT_GET_FIX_STRING = "CANT_GET_FIX";
 | 
			
		||||
const char *RESET_FAIL_STRING = "RESET_FAIL";
 | 
			
		||||
const char *P60_BOOT_COUNT_STRING = "P60_BOOT_COUNT";
 | 
			
		||||
const char *BATT_MODE_STRING = "BATT_MODE";
 | 
			
		||||
const char *BATT_MODE_CHANGED_STRING = "BATT_MODE_CHANGED";
 | 
			
		||||
@@ -488,15 +478,9 @@ const char *translateEvents(Event event) {
 | 
			
		||||
    case (8900):
 | 
			
		||||
      return CLOCK_SET_STRING;
 | 
			
		||||
    case (8901):
 | 
			
		||||
      return CLOCK_DUMP_LEGACY_STRING;
 | 
			
		||||
      return CLOCK_DUMP_STRING;
 | 
			
		||||
    case (8902):
 | 
			
		||||
      return CLOCK_SET_FAILURE_STRING;
 | 
			
		||||
    case (8903):
 | 
			
		||||
      return CLOCK_DUMP_STRING;
 | 
			
		||||
    case (8904):
 | 
			
		||||
      return CLOCK_DUMP_BEFORE_SETTING_TIME_STRING;
 | 
			
		||||
    case (8905):
 | 
			
		||||
      return CLOCK_DUMP_AFTER_SETTING_TIME_STRING;
 | 
			
		||||
    case (9100):
 | 
			
		||||
      return TC_DELETION_FAILED_STRING;
 | 
			
		||||
    case (9700):
 | 
			
		||||
@@ -518,7 +502,7 @@ const char *translateEvents(Event event) {
 | 
			
		||||
    case (11200):
 | 
			
		||||
      return SAFE_RATE_VIOLATION_STRING;
 | 
			
		||||
    case (11201):
 | 
			
		||||
      return RATE_RECOVERY_STRING;
 | 
			
		||||
      return SAFE_RATE_RECOVERY_STRING;
 | 
			
		||||
    case (11202):
 | 
			
		||||
      return MULTIPLE_RW_INVALID_STRING;
 | 
			
		||||
    case (11203):
 | 
			
		||||
@@ -528,17 +512,11 @@ const char *translateEvents(Event event) {
 | 
			
		||||
    case (11205):
 | 
			
		||||
      return MEKF_AUTOMATIC_RESET_STRING;
 | 
			
		||||
    case (11206):
 | 
			
		||||
      return PTG_CTRL_NO_ATTITUDE_INFORMATION_STRING;
 | 
			
		||||
      return MEKF_INVALID_MODE_VIOLATION_STRING;
 | 
			
		||||
    case (11207):
 | 
			
		||||
      return SAFE_MODE_CONTROLLER_FAILURE_STRING;
 | 
			
		||||
    case (11208):
 | 
			
		||||
      return TLE_TOO_OLD_STRING;
 | 
			
		||||
    case (11209):
 | 
			
		||||
      return TLE_FILE_READ_FAILED_STRING;
 | 
			
		||||
    case (11210):
 | 
			
		||||
      return PTG_RATE_VIOLATION_STRING;
 | 
			
		||||
    case (11211):
 | 
			
		||||
      return DETUMBLE_TRANSITION_FAILED_STRING;
 | 
			
		||||
    case (11300):
 | 
			
		||||
      return SWITCH_CMD_SENT_STRING;
 | 
			
		||||
    case (11301):
 | 
			
		||||
@@ -607,8 +585,6 @@ const char *translateEvents(Event event) {
 | 
			
		||||
      return SUPV_NOT_ON_STRING;
 | 
			
		||||
    case (11608):
 | 
			
		||||
      return SUPV_REPLY_TIMEOUT_STRING;
 | 
			
		||||
    case (11609):
 | 
			
		||||
      return CAM_MUST_BE_ON_FOR_SNAPSHOT_MODE_STRING;
 | 
			
		||||
    case (11701):
 | 
			
		||||
      return SELF_TEST_I2C_FAILURE_STRING;
 | 
			
		||||
    case (11702):
 | 
			
		||||
@@ -651,10 +627,6 @@ const char *translateEvents(Event event) {
 | 
			
		||||
      return SUPV_HELPER_EXECUTING_STRING;
 | 
			
		||||
    case (12008):
 | 
			
		||||
      return SUPV_MPSOC_SHUTDOWN_BUILD_FAILED_STRING;
 | 
			
		||||
    case (12009):
 | 
			
		||||
      return SUPV_ACK_UNKNOWN_COMMAND_STRING;
 | 
			
		||||
    case (12010):
 | 
			
		||||
      return SUPV_EXE_ACK_UNKNOWN_COMMAND_STRING;
 | 
			
		||||
    case (12100):
 | 
			
		||||
      return SANITIZATION_FAILED_STRING;
 | 
			
		||||
    case (12101):
 | 
			
		||||
@@ -813,8 +785,6 @@ const char *translateEvents(Event event) {
 | 
			
		||||
      return GPS_FIX_CHANGE_STRING;
 | 
			
		||||
    case (13101):
 | 
			
		||||
      return CANT_GET_FIX_STRING;
 | 
			
		||||
    case (13102):
 | 
			
		||||
      return RESET_FAIL_STRING;
 | 
			
		||||
    case (13200):
 | 
			
		||||
      return P60_BOOT_COUNT_STRING;
 | 
			
		||||
    case (13201):
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,8 @@
 | 
			
		||||
/**
 | 
			
		||||
 * @brief  Auto-generated object translation file.
 | 
			
		||||
 * @details
 | 
			
		||||
 * Contains 176 translations.
 | 
			
		||||
 * Generated on: 2024-05-06 13:47:38
 | 
			
		||||
 * Contains 175 translations.
 | 
			
		||||
 * Generated on: 2023-10-27 14:24:05
 | 
			
		||||
 */
 | 
			
		||||
#include "translateObjects.h"
 | 
			
		||||
 | 
			
		||||
@@ -65,7 +65,6 @@ const char *PTME_VC3_CFDP_TM_STRING = "PTME_VC3_CFDP_TM";
 | 
			
		||||
const char *PLOC_MPSOC_HANDLER_STRING = "PLOC_MPSOC_HANDLER";
 | 
			
		||||
const char *PLOC_SUPERVISOR_HANDLER_STRING = "PLOC_SUPERVISOR_HANDLER";
 | 
			
		||||
const char *PLOC_SUPERVISOR_HELPER_STRING = "PLOC_SUPERVISOR_HELPER";
 | 
			
		||||
const char *PLOC_MPSOC_COMMUNICATION_STRING = "PLOC_MPSOC_COMMUNICATION";
 | 
			
		||||
const char *SCEX_STRING = "SCEX";
 | 
			
		||||
const char *SOLAR_ARRAY_DEPL_HANDLER_STRING = "SOLAR_ARRAY_DEPL_HANDLER";
 | 
			
		||||
const char *HEATER_HANDLER_STRING = "HEATER_HANDLER";
 | 
			
		||||
@@ -303,8 +302,6 @@ const char *translateObject(object_id_t object) {
 | 
			
		||||
      return PLOC_SUPERVISOR_HANDLER_STRING;
 | 
			
		||||
    case 0x44330017:
 | 
			
		||||
      return PLOC_SUPERVISOR_HELPER_STRING;
 | 
			
		||||
    case 0x44330018:
 | 
			
		||||
      return PLOC_MPSOC_COMMUNICATION_STRING;
 | 
			
		||||
    case 0x44330032:
 | 
			
		||||
      return SCEX_STRING;
 | 
			
		||||
    case 0x444100A2:
 | 
			
		||||
 
 | 
			
		||||
@@ -38,7 +38,9 @@
 | 
			
		||||
 | 
			
		||||
#include "devices/gpioIds.h"
 | 
			
		||||
#include "fsfw_hal/linux/gpio/Gpio.h"
 | 
			
		||||
#include "linux/payload/FreshSupvHandler.h"
 | 
			
		||||
#include "linux/payload/PlocMpsocHandler.h"
 | 
			
		||||
#include "linux/payload/PlocMpsocSpecialComHelper.h"
 | 
			
		||||
#include "linux/payload/PlocSupervisorHandler.h"
 | 
			
		||||
#include "linux/payload/PlocSupvUartMan.h"
 | 
			
		||||
#include "test/gpio/DummyGpioIF.h"
 | 
			
		||||
#endif
 | 
			
		||||
@@ -77,10 +79,7 @@ void ObjectFactory::produce(void* args) {
 | 
			
		||||
    switcherList.emplace_back(initVal);
 | 
			
		||||
  }
 | 
			
		||||
  dummySwitcher->setInitialSwitcherList(switcherList);
 | 
			
		||||
 | 
			
		||||
#ifdef PLATFORM_UNIX
 | 
			
		||||
  // Obsolete dev handler..
 | 
			
		||||
  /*
 | 
			
		||||
  new SerialComIF(objects::UART_COM_IF);
 | 
			
		||||
#if OBSW_ADD_PLOC_MPSOC == 1
 | 
			
		||||
  std::string mpscoDev = "";
 | 
			
		||||
@@ -91,19 +90,17 @@ void ObjectFactory::produce(void* args) {
 | 
			
		||||
  new PlocMpsocHandler(objects::PLOC_MPSOC_HANDLER, objects::UART_COM_IF, mpsocCookie,
 | 
			
		||||
                       plocMpsocHelper, Gpio(gpioIds::ENABLE_MPSOC_UART, dummyGpioIF),
 | 
			
		||||
                       objects::PLOC_SUPERVISOR_HANDLER);
 | 
			
		||||
#endif // OBSW_ADD_PLOC_MPSOC == 1
 | 
			
		||||
  */
 | 
			
		||||
#endif /* OBSW_ADD_PLOC_MPSOC == 1 */
 | 
			
		||||
#if OBSW_ADD_PLOC_SUPERVISOR == 1
 | 
			
		||||
  std::string plocSupvString = "/dev/ploc_supv";
 | 
			
		||||
  auto supervisorCookie =
 | 
			
		||||
      new SerialCookie(objects::PLOC_SUPERVISOR_HANDLER, plocSupvString, uart::PLOC_SUPV_BAUD,
 | 
			
		||||
                       supv::MAX_PACKET_SIZE * 20, UartModes::NON_CANONICAL);
 | 
			
		||||
  supervisorCookie->setNoFixedSizeReply();
 | 
			
		||||
  new PlocSupvUartManager(objects::PLOC_SUPERVISOR_HELPER);
 | 
			
		||||
  DhbConfig dhbConf(objects::PLOC_SUPERVISOR_HANDLER);
 | 
			
		||||
  auto* supvHandler =
 | 
			
		||||
      new FreshSupvHandler(dhbConf, supervisorCookie, Gpio(gpioIds::ENABLE_SUPV_UART, dummyGpioIF),
 | 
			
		||||
                           dummySwitcher, power::PDU1_CH6_PLOC_12V);
 | 
			
		||||
  auto supvHelper = new PlocSupvUartManager(objects::PLOC_SUPERVISOR_HELPER);
 | 
			
		||||
  new PlocSupervisorHandler(objects::PLOC_SUPERVISOR_HANDLER, supervisorCookie,
 | 
			
		||||
                            Gpio(gpioIds::ENABLE_SUPV_UART, dummyGpioIF), pcdu::PDU1_CH6_PLOC_12V,
 | 
			
		||||
                            *supvHelper);
 | 
			
		||||
#endif /* OBSW_ADD_PLOC_SUPERVISOR == 1 */
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -25,4 +25,3 @@ add_subdirectory(memory)
 | 
			
		||||
add_subdirectory(callbacks)
 | 
			
		||||
add_subdirectory(xadc)
 | 
			
		||||
add_subdirectory(fs)
 | 
			
		||||
add_subdirectory(acs)
 | 
			
		||||
 
 | 
			
		||||
@@ -1 +0,0 @@
 | 
			
		||||
# target_sources(${OBSW_NAME} PUBLIC <Source File List>)
 | 
			
		||||
@@ -1,23 +0,0 @@
 | 
			
		||||
#include <optional>
 | 
			
		||||
 | 
			
		||||
#include "bsp_q7s/fs/SdCardManager.h"
 | 
			
		||||
#include "mission/acs/str/strHelpers.h"
 | 
			
		||||
 | 
			
		||||
class StrConfigPathGetter : public startracker::SdCardConfigPathGetter {
 | 
			
		||||
 public:
 | 
			
		||||
  StrConfigPathGetter(SdCardManager& sdcMan) : sdcMan(sdcMan) {}
 | 
			
		||||
 | 
			
		||||
  std::optional<std::string> getCfgPath() override {
 | 
			
		||||
    if (!sdcMan.isSdCardUsable(std::nullopt)) {
 | 
			
		||||
      return std::nullopt;
 | 
			
		||||
    }
 | 
			
		||||
    if (sdcMan.getActiveSdCard() == sd::SdCard::SLOT_1) {
 | 
			
		||||
      return std::string("/mnt/sd1/startracker/flight-config.json");
 | 
			
		||||
    } else {
 | 
			
		||||
      return std::string("/mnt/sd0/startracker/flight-config.json");
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 private:
 | 
			
		||||
  SdCardManager& sdcMan;
 | 
			
		||||
};
 | 
			
		||||
@@ -18,8 +18,7 @@ static constexpr char I2C_Q7_EIVE[] = "/dev/i2c_q7";
 | 
			
		||||
 | 
			
		||||
static constexpr char UART_GNSS_DEV[] = "/dev/gps0";
 | 
			
		||||
static constexpr char UART_PLOC_MPSOC_DEV[] = "/dev/ul_plmpsoc";
 | 
			
		||||
static constexpr char UART_PLOC_SUPERVISOR_DEV_FALLBACK[] = "/dev/ttyUL4";
 | 
			
		||||
static constexpr char UART_PLOC_SUPERVISOR_DEV[] = "/dev/ploc_supv";
 | 
			
		||||
static constexpr char UART_PLOC_SUPERVSIOR_DEV[] = "/dev/ploc_supv";
 | 
			
		||||
static constexpr char UART_SYRLINKS_DEV[] = "/dev/ul_syrlinks";
 | 
			
		||||
static constexpr char UART_STAR_TRACKER_DEV[] = "/dev/ul_str";
 | 
			
		||||
static constexpr char UART_SCEX_DEV[] = "/dev/scex";
 | 
			
		||||
 
 | 
			
		||||
@@ -359,6 +359,29 @@ ReturnValue_t CoreController::executeAction(ActionId_t actionId, MessageQueueId_
 | 
			
		||||
    case (OBSW_UPDATE_FROM_TMP): {
 | 
			
		||||
      return executeSwUpdate(SwUpdateSources::TMP_DIR, data, size);
 | 
			
		||||
    }
 | 
			
		||||
    case (ENABLE_AUTO_SWITCH): {
 | 
			
		||||
      if (size < 2) {
 | 
			
		||||
        return HasActionsIF::INVALID_PARAMETERS;
 | 
			
		||||
      }
 | 
			
		||||
      uint8_t chip = data[0];
 | 
			
		||||
      uint8_t copy = data[1];
 | 
			
		||||
      if (chip > 1 or copy > 1) {
 | 
			
		||||
        return HasActionsIF::INVALID_PARAMETERS;
 | 
			
		||||
      }
 | 
			
		||||
      std::string value = std::to_string(chip) + std::to_string(copy);
 | 
			
		||||
      ReturnValue_t result = scratch::writeString(scratch::AUTO_SWITCH_IMAGE, value);
 | 
			
		||||
      if (result == returnvalue::OK) {
 | 
			
		||||
        return EXECUTION_FINISHED;
 | 
			
		||||
      }
 | 
			
		||||
      return result;
 | 
			
		||||
    }
 | 
			
		||||
    case (DISABLE_AUTO_SWITCH): {
 | 
			
		||||
      ReturnValue_t result = scratch::clearValue(scratch::AUTO_SWITCH_IMAGE);
 | 
			
		||||
      if (result != returnvalue::OK and result != scratch::KEY_NOT_FOUND) {
 | 
			
		||||
        return result;
 | 
			
		||||
      }
 | 
			
		||||
      return EXECUTION_FINISHED;
 | 
			
		||||
    }
 | 
			
		||||
    case (SWITCH_TO_SD_0): {
 | 
			
		||||
      if (not startSdStateMachine(sd::SdCard::SLOT_0, SdCfgMode::COLD_REDUNDANT, commandedBy,
 | 
			
		||||
                                  actionId)) {
 | 
			
		||||
@@ -480,16 +503,6 @@ ReturnValue_t CoreController::executeAction(ActionId_t actionId, MessageQueueId_
 | 
			
		||||
      successRecipient = commandedBy;
 | 
			
		||||
      return returnvalue::OK;
 | 
			
		||||
    }
 | 
			
		||||
    case (UPDATE_LEAP_SECONDS): {
 | 
			
		||||
      if (size != sizeof(uint16_t)) {
 | 
			
		||||
        return HasActionsIF::INVALID_PARAMETERS;
 | 
			
		||||
      }
 | 
			
		||||
      ReturnValue_t result = actionUpdateLeapSeconds(data);
 | 
			
		||||
      if (result != returnvalue::OK) {
 | 
			
		||||
        return result;
 | 
			
		||||
      }
 | 
			
		||||
      return HasActionsIF::EXECUTION_FINISHED;
 | 
			
		||||
    }
 | 
			
		||||
    default: {
 | 
			
		||||
      return HasActionsIF::INVALID_ACTION_ID;
 | 
			
		||||
    }
 | 
			
		||||
@@ -1421,9 +1434,6 @@ void CoreController::performMountedSdCardOperations() {
 | 
			
		||||
      if (not timeFileInitDone) {
 | 
			
		||||
        initClockFromTimeFile();
 | 
			
		||||
      }
 | 
			
		||||
      if (not leapSecondsInitDone) {
 | 
			
		||||
        initLeapSeconds();
 | 
			
		||||
      }
 | 
			
		||||
      performRebootWatchdogHandling(false);
 | 
			
		||||
      performRebootCountersHandling(false);
 | 
			
		||||
    }
 | 
			
		||||
@@ -2079,78 +2089,14 @@ ReturnValue_t CoreController::backupTimeFileHandler() {
 | 
			
		||||
  return returnvalue::OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void CoreController::initLeapSeconds() {
 | 
			
		||||
  ReturnValue_t result = initLeapSecondsFromFile();
 | 
			
		||||
  if (result != returnvalue::OK) {
 | 
			
		||||
    Clock::setLeapSeconds(config::LEAP_SECONDS);
 | 
			
		||||
    writeLeapSecondsToFile(config::LEAP_SECONDS);
 | 
			
		||||
  }
 | 
			
		||||
  leapSecondsInitDone = true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ReturnValue_t CoreController::initLeapSecondsFromFile() {
 | 
			
		||||
  std::string fileName = currMntPrefix + LEAP_SECONDS_FILE;
 | 
			
		||||
  std::error_code e;
 | 
			
		||||
  if (sdcMan->isSdCardUsable(std::nullopt) and std::filesystem::exists(fileName, e)) {
 | 
			
		||||
    std::ifstream leapSecondsFile(fileName);
 | 
			
		||||
    std::string nextWord;
 | 
			
		||||
    std::getline(leapSecondsFile, nextWord);
 | 
			
		||||
    std::istringstream iss(nextWord);
 | 
			
		||||
    iss >> nextWord;
 | 
			
		||||
    if (iss.bad() or nextWord != "LEAP") {
 | 
			
		||||
      return returnvalue::FAILED;
 | 
			
		||||
    }
 | 
			
		||||
    iss >> nextWord;
 | 
			
		||||
    if (iss.bad() or nextWord != "SECONDS:") {
 | 
			
		||||
      return returnvalue::FAILED;
 | 
			
		||||
    }
 | 
			
		||||
    iss >> nextWord;
 | 
			
		||||
    uint16_t leapSeconds = 0;
 | 
			
		||||
    leapSeconds = std::stoi(nextWord.c_str());
 | 
			
		||||
    if (iss.bad()) {
 | 
			
		||||
      return returnvalue::FAILED;
 | 
			
		||||
    }
 | 
			
		||||
    Clock::setLeapSeconds(leapSeconds);
 | 
			
		||||
    return returnvalue::OK;
 | 
			
		||||
  }
 | 
			
		||||
  sif::error
 | 
			
		||||
      << "CoreController::leapSecondsFileHandler: Initalization of leap seconds from file failed"
 | 
			
		||||
      << std::endl;
 | 
			
		||||
  return returnvalue::FAILED;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
ReturnValue_t CoreController::writeLeapSecondsToFile(const uint16_t leapSeconds) {
 | 
			
		||||
  std::string fileName = currMntPrefix + LEAP_SECONDS_FILE;
 | 
			
		||||
  if (not sdcMan->isSdCardUsable(std::nullopt)) {
 | 
			
		||||
    return returnvalue::FAILED;
 | 
			
		||||
  }
 | 
			
		||||
  std::ofstream leapSecondsFile(fileName.c_str(), std::ofstream::out | std::ofstream::trunc);
 | 
			
		||||
  if (not leapSecondsFile.good()) {
 | 
			
		||||
    sif::error << "CoreController::leapSecondsFileHandler: Error opening leap seconds file: "
 | 
			
		||||
               << strerror(errno) << std::endl;
 | 
			
		||||
    return returnvalue::FAILED;
 | 
			
		||||
  }
 | 
			
		||||
  leapSecondsFile << "LEAP SECONDS: " << leapSeconds << std::endl;
 | 
			
		||||
  return returnvalue::OK;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
ReturnValue_t CoreController::actionUpdateLeapSeconds(const uint8_t *data) {
 | 
			
		||||
  uint16_t leapSeconds = data[1] | (data[0] << 8);
 | 
			
		||||
  ReturnValue_t result = writeLeapSecondsToFile(leapSeconds);
 | 
			
		||||
  if (result != returnvalue::OK) {
 | 
			
		||||
    return result;
 | 
			
		||||
  }
 | 
			
		||||
  Clock::setLeapSeconds(leapSeconds);
 | 
			
		||||
  return returnvalue::OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ReturnValue_t CoreController::initClockFromTimeFile() {
 | 
			
		||||
  using namespace GpsHyperion;
 | 
			
		||||
  using namespace std;
 | 
			
		||||
  std::string fileName = currMntPrefix + BACKUP_TIME_FILE;
 | 
			
		||||
  std::error_code e;
 | 
			
		||||
  if (sdcMan->isSdCardUsable(std::nullopt) and std::filesystem::exists(fileName, e) and
 | 
			
		||||
      ((gpsFix == FixMode::NOT_SEEN) or not utility::timeSanityCheck())) {
 | 
			
		||||
      ((gpsFix == FixMode::UNKNOWN or gpsFix == FixMode::NOT_SEEN) or
 | 
			
		||||
       not utility::timeSanityCheck())) {
 | 
			
		||||
    ifstream timeFile(fileName);
 | 
			
		||||
    string nextWord;
 | 
			
		||||
    getline(timeFile, nextWord);
 | 
			
		||||
 
 | 
			
		||||
@@ -9,7 +9,7 @@
 | 
			
		||||
#include <fsfw/parameters/ReceivesParameterMessagesIF.h>
 | 
			
		||||
#include <fsfw_hal/linux/uio/UioMapper.h>
 | 
			
		||||
#include <libxiphos.h>
 | 
			
		||||
#include <linux/acs/GPSDefinitions.h>
 | 
			
		||||
#include <mission/acs/archive/GPSDefinitions.h>
 | 
			
		||||
#include <mission/utility/trace.h>
 | 
			
		||||
 | 
			
		||||
#include <atomic>
 | 
			
		||||
@@ -150,8 +150,6 @@ class CoreController : public ExtendedControllerBase, public ReceivesParameterMe
 | 
			
		||||
      std::string(core::LEGACY_REBOOT_WATCHDOG_FILE_NAME);
 | 
			
		||||
  const std::string REBOOT_WATCHDOG_FILE =
 | 
			
		||||
      "/" + std::string(core::CONF_FOLDER) + "/" + std::string(core::REBOOT_WATCHDOG_FILE_NAME);
 | 
			
		||||
  const std::string LEAP_SECONDS_FILE =
 | 
			
		||||
      "/" + std::string(core::CONF_FOLDER) + "/" + std::string(core::LEAP_SECONDS_FILE_NAME);
 | 
			
		||||
  const std::string BACKUP_TIME_FILE =
 | 
			
		||||
      "/" + std::string(core::CONF_FOLDER) + "/" + std::string(core::TIME_FILE_NAME);
 | 
			
		||||
  const std::string REBOOT_COUNTERS_FILE =
 | 
			
		||||
@@ -211,7 +209,7 @@ class CoreController : public ExtendedControllerBase, public ReceivesParameterMe
 | 
			
		||||
  static constexpr MutexIF::TimeoutType TIMEOUT_TYPE = MutexIF::TimeoutType::WAITING;
 | 
			
		||||
  static constexpr uint32_t MUTEX_TIMEOUT = 20;
 | 
			
		||||
  bool enableHkSet = false;
 | 
			
		||||
  GpsHyperion::FixMode gpsFix = GpsHyperion::FixMode::NOT_SEEN;
 | 
			
		||||
  GpsHyperion::FixMode gpsFix = GpsHyperion::FixMode::UNKNOWN;
 | 
			
		||||
 | 
			
		||||
  // States for SD state machine, which is used in non-blocking mode
 | 
			
		||||
  enum class SdStates {
 | 
			
		||||
@@ -298,7 +296,6 @@ class CoreController : public ExtendedControllerBase, public ReceivesParameterMe
 | 
			
		||||
 | 
			
		||||
  std::string currMntPrefix;
 | 
			
		||||
  bool timeFileInitDone = false;
 | 
			
		||||
  bool leapSecondsInitDone = false;
 | 
			
		||||
  bool performOneShotSdCardOpsSwitch = false;
 | 
			
		||||
  uint8_t shortSdCardCdCounter = 0;
 | 
			
		||||
#if OBSW_THREAD_TRACING == 1
 | 
			
		||||
@@ -338,11 +335,7 @@ class CoreController : public ExtendedControllerBase, public ReceivesParameterMe
 | 
			
		||||
  void performMountedSdCardOperations();
 | 
			
		||||
  ReturnValue_t initVersionFile();
 | 
			
		||||
 | 
			
		||||
  void initLeapSeconds();
 | 
			
		||||
  ReturnValue_t initLeapSecondsFromFile();
 | 
			
		||||
  ReturnValue_t initClockFromTimeFile();
 | 
			
		||||
  ReturnValue_t actionUpdateLeapSeconds(const uint8_t* data);
 | 
			
		||||
  ReturnValue_t writeLeapSecondsToFile(const uint16_t leapSeconds);
 | 
			
		||||
  ReturnValue_t performSdCardCheck();
 | 
			
		||||
  ReturnValue_t backupTimeFileHandler();
 | 
			
		||||
  ReturnValue_t initBootCopyFile();
 | 
			
		||||
 
 | 
			
		||||
@@ -117,11 +117,10 @@ void ObjectFactory::produce(void* args) {
 | 
			
		||||
#if OBSW_ADD_BPX_BATTERY_HANDLER == 1
 | 
			
		||||
  createBpxBatteryComponent(enableHkSets, battAndImtqI2cDev);
 | 
			
		||||
#endif
 | 
			
		||||
  createPowerController(true, enableHkSets);
 | 
			
		||||
 | 
			
		||||
  dummy::createDummies(dummyCfg, *pwrSwitcher, gpioComIF, enableHkSets);
 | 
			
		||||
 | 
			
		||||
  createPowerController(true, enableHkSets);
 | 
			
		||||
 | 
			
		||||
  new CoreController(objects::CORE_CONTROLLER, enableHkSets);
 | 
			
		||||
 | 
			
		||||
  auto* stackHandler = new Stack5VHandler(*pwrSwitcher);
 | 
			
		||||
@@ -144,18 +143,18 @@ void ObjectFactory::produce(void* args) {
 | 
			
		||||
  createImtqComponents(pwrSwitcher, enableHkSets, battAndImtqI2cDev);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if OBSW_ADD_SYRLINKS == 1
 | 
			
		||||
  createSyrlinksComponents(pwrSwitcher);
 | 
			
		||||
#endif /* OBSW_ADD_SYRLINKS == 1 */
 | 
			
		||||
 | 
			
		||||
#if OBSW_ADD_RW == 1
 | 
			
		||||
  createReactionWheelComponents(gpioComIF, pwrSwitcher);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if OBSW_ADD_STAR_TRACKER == 1
 | 
			
		||||
  createStrComponents(pwrSwitcher, *SdCardManager::instance());
 | 
			
		||||
  createStrComponents(pwrSwitcher);
 | 
			
		||||
#endif /* OBSW_ADD_STAR_TRACKER == 1 */
 | 
			
		||||
 | 
			
		||||
#if OBSW_ADD_SYRLINKS == 1
 | 
			
		||||
  createSyrlinksComponents(pwrSwitcher);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if OBSW_ADD_PL_PCDU == 1
 | 
			
		||||
  createPlPcduComponents(gpioComIF, spiMainComIF, pwrSwitcher, *stackHandler);
 | 
			
		||||
#endif
 | 
			
		||||
@@ -164,8 +163,8 @@ void ObjectFactory::produce(void* args) {
 | 
			
		||||
#if OBSW_ADD_CCSDS_IP_CORES == 1
 | 
			
		||||
  CcsdsIpCoreHandler* ipCoreHandler = nullptr;
 | 
			
		||||
  CcsdsComponentArgs ccsdsArgs(*gpioComIF, *ipcStore, *tmStore, stores, *pusFunnel, *cfdpFunnel,
 | 
			
		||||
                               &ipCoreHandler, 0, 0);
 | 
			
		||||
  createCcsdsIpComponentsWrapper(ccsdsArgs);
 | 
			
		||||
                               &ipCoreHandler);
 | 
			
		||||
  createCcsdsIpComponentsAddTmRouting(ccsdsArgs);
 | 
			
		||||
#endif /* OBSW_ADD_CCSDS_IP_CORES == 1 */
 | 
			
		||||
 | 
			
		||||
  /* Test Task */
 | 
			
		||||
@@ -176,7 +175,7 @@ void ObjectFactory::produce(void* args) {
 | 
			
		||||
  createScexComponents(q7s::UART_SCEX_DEV, pwrSwitcher, *SdCardManager::instance(), false,
 | 
			
		||||
                       power::Switches::PDU1_CH5_SOLAR_CELL_EXP_5V);
 | 
			
		||||
#endif
 | 
			
		||||
  createAcsController(true, enableHkSets, *SdCardManager::instance());
 | 
			
		||||
  createAcsController(true, enableHkSets);
 | 
			
		||||
  HeaterHandler* heaterHandler;
 | 
			
		||||
  createHeaterComponents(gpioComIF, pwrSwitcher, healthTable, heaterHandler);
 | 
			
		||||
  createThermalController(*heaterHandler, true);
 | 
			
		||||
 
 | 
			
		||||
@@ -109,14 +109,14 @@ void ObjectFactory::produce(void* args) {
 | 
			
		||||
  createPayloadComponents(gpioComIF, *pwrSwitcher);
 | 
			
		||||
 | 
			
		||||
#if OBSW_ADD_STAR_TRACKER == 1
 | 
			
		||||
  createStrComponents(pwrSwitcher, *SdCardManager::instance());
 | 
			
		||||
  createStrComponents(pwrSwitcher);
 | 
			
		||||
#endif /* OBSW_ADD_STAR_TRACKER == 1 */
 | 
			
		||||
 | 
			
		||||
#if OBSW_ADD_CCSDS_IP_CORES == 1
 | 
			
		||||
  CcsdsIpCoreHandler* ipCoreHandler = nullptr;
 | 
			
		||||
  CcsdsComponentArgs ccsdsArgs(*gpioComIF, *ipcStore, *tmStore, stores, *pusFunnel, *cfdpFunnel,
 | 
			
		||||
                               &ipCoreHandler, 0, 0);
 | 
			
		||||
  createCcsdsIpComponentsWrapper(ccsdsArgs);
 | 
			
		||||
                               &ipCoreHandler);
 | 
			
		||||
  createCcsdsIpComponentsAddTmRouting(ccsdsArgs);
 | 
			
		||||
#endif /* OBSW_ADD_CCSDS_IP_CORES == 1 */
 | 
			
		||||
 | 
			
		||||
#if OBSW_ADD_SCEX_DEVICE == 1
 | 
			
		||||
@@ -130,6 +130,6 @@ void ObjectFactory::produce(void* args) {
 | 
			
		||||
 | 
			
		||||
  createMiscComponents();
 | 
			
		||||
  createThermalController(*heaterHandler, false);
 | 
			
		||||
  createAcsController(true, enableHkSets, *SdCardManager::instance());
 | 
			
		||||
  createAcsController(true, enableHkSets);
 | 
			
		||||
  satsystem::init(false);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -19,6 +19,7 @@ namespace scratch {
 | 
			
		||||
 | 
			
		||||
static constexpr char PREFERED_SDC_KEY[] = "PREFSD";
 | 
			
		||||
static constexpr char ALLOC_FAILURE_COUNT[] = "ALLOCERR";
 | 
			
		||||
static constexpr char AUTO_SWITCH_IMAGE[] = "ASWI";
 | 
			
		||||
 | 
			
		||||
static constexpr uint8_t INTERFACE_ID = CLASS_ID::SCRATCH_BUFFER;
 | 
			
		||||
static constexpr ReturnValue_t KEY_NOT_FOUND = returnvalue::makeCode(INTERFACE_ID, 0);
 | 
			
		||||
@@ -76,7 +77,6 @@ ReturnValue_t readToFile(std::string name, std::ifstream& file, std::string& fil
 | 
			
		||||
  int result = std::system(oss.str().c_str());
 | 
			
		||||
  if (result != 0) {
 | 
			
		||||
    if (WEXITSTATUS(result) == 1) {
 | 
			
		||||
      sif::warning << "scratch::readToFile: Key " << name << " does not exist" << std::endl;
 | 
			
		||||
      // Could not find value
 | 
			
		||||
      std::remove(filename.c_str());
 | 
			
		||||
      return KEY_NOT_FOUND;
 | 
			
		||||
 
 | 
			
		||||
@@ -10,10 +10,10 @@
 | 
			
		||||
#include <linux/acs/RwPollingTask.h>
 | 
			
		||||
#include <linux/acs/StrComHandler.h>
 | 
			
		||||
#include <linux/com/SyrlinksComHandler.h>
 | 
			
		||||
#include <linux/payload/FreshMpsocHandler.h>
 | 
			
		||||
#include <linux/payload/MpsocCommunication.h>
 | 
			
		||||
#include <linux/payload/PlocMemoryDumper.h>
 | 
			
		||||
#include <linux/payload/PlocMpsocHandler.h>
 | 
			
		||||
#include <linux/payload/PlocMpsocSpecialComHelper.h>
 | 
			
		||||
#include <linux/payload/PlocSupervisorHandler.h>
 | 
			
		||||
#include <linux/payload/ScexUartReader.h>
 | 
			
		||||
#include <linux/payload/plocMpsocHelpers.h>
 | 
			
		||||
#include <linux/power/CspComIF.h>
 | 
			
		||||
@@ -37,10 +37,11 @@
 | 
			
		||||
#include <cstring>
 | 
			
		||||
 | 
			
		||||
#include "OBSWConfig.h"
 | 
			
		||||
#include "bsp_q7s/acs/StrConfigPathGetter.h"
 | 
			
		||||
#include "bsp_q7s/boardtest/Q7STestTask.h"
 | 
			
		||||
#include "bsp_q7s/callbacks/gnssCallback.h"
 | 
			
		||||
#include "bsp_q7s/callbacks/pcduSwitchCb.h"
 | 
			
		||||
#include "bsp_q7s/callbacks/q7sGpioCallbacks.h"
 | 
			
		||||
#include "bsp_q7s/callbacks/rwSpiCallback.h"
 | 
			
		||||
#include "busConf.h"
 | 
			
		||||
#include "ccsdsConfig.h"
 | 
			
		||||
#include "devConf.h"
 | 
			
		||||
@@ -48,7 +49,6 @@
 | 
			
		||||
#include "devices/gpioIds.h"
 | 
			
		||||
#include "devices/powerSwitcherList.h"
 | 
			
		||||
#include "eive/definitions.h"
 | 
			
		||||
#include "eive/objects.h"
 | 
			
		||||
#include "fsfw/ipc/QueueFactory.h"
 | 
			
		||||
#include "linux/ObjectFactory.h"
 | 
			
		||||
#include "linux/boardtest/I2cTestClass.h"
 | 
			
		||||
@@ -60,12 +60,7 @@
 | 
			
		||||
#include "linux/ipcore/PdecHandler.h"
 | 
			
		||||
#include "linux/ipcore/Ptme.h"
 | 
			
		||||
#include "linux/ipcore/PtmeConfig.h"
 | 
			
		||||
#include "linux/payload/FreshSupvHandler.h"
 | 
			
		||||
#include "linux/payload/MpsocCommunication.h"
 | 
			
		||||
#include "linux/payload/PlocMpsocSpecialComHelper.h"
 | 
			
		||||
#include "linux/payload/SerialConfig.h"
 | 
			
		||||
#include "mission/config/configfile.h"
 | 
			
		||||
#include "mission/power/defs.h"
 | 
			
		||||
#include "mission/system/acs/AcsBoardFdir.h"
 | 
			
		||||
#include "mission/system/acs/AcsSubsystem.h"
 | 
			
		||||
#include "mission/system/acs/RwAssembly.h"
 | 
			
		||||
@@ -73,11 +68,11 @@
 | 
			
		||||
#include "mission/system/acs/acsModeTree.h"
 | 
			
		||||
#include "mission/system/com/SyrlinksFdir.h"
 | 
			
		||||
#include "mission/system/com/comModeTree.h"
 | 
			
		||||
#include "mission/system/payload/payloadModeTree.h"
 | 
			
		||||
#include "mission/system/power/GomspacePowerFdir.h"
 | 
			
		||||
#include "mission/system/tcs/RtdFdir.h"
 | 
			
		||||
#include "mission/system/tcs/TcsBoardAssembly.h"
 | 
			
		||||
#include "mission/system/tcs/tcsModeTree.h"
 | 
			
		||||
#include "mission/system/tree/payloadModeTree.h"
 | 
			
		||||
#include "mission/tmtc/tmFilters.h"
 | 
			
		||||
#include "mission/utility/GlobalConfigHandler.h"
 | 
			
		||||
#include "tmtc/pusIds.h"
 | 
			
		||||
@@ -516,7 +511,7 @@ void ObjectFactory::createAcsBoardComponents(SpiComIF& spiComIF, LinuxLibgpioIF*
 | 
			
		||||
  debugGps = true;
 | 
			
		||||
#endif
 | 
			
		||||
  RESET_ARGS_GNSS.gpioComIF = gpioComIF;
 | 
			
		||||
  RESET_ARGS_GNSS.waitPeriodMs = 10 * 1e3;
 | 
			
		||||
  RESET_ARGS_GNSS.waitPeriodMs = 5;
 | 
			
		||||
  auto gpsCtrl = new GpsHyperionLinuxController(objects::GPS_CONTROLLER, objects::NO_OBJECT,
 | 
			
		||||
                                                enableHkSets, debugGps);
 | 
			
		||||
  gpsCtrl->setResetPinTriggerFunction(gps::triggerGpioResetPin, &RESET_ARGS_GNSS);
 | 
			
		||||
@@ -598,13 +593,14 @@ void ObjectFactory::createSolarArrayDeploymentComponents(PowerSwitchIF& pwrSwitc
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ObjectFactory::createSyrlinksComponents(PowerSwitchIF* pwrSwitcher) {
 | 
			
		||||
  new SyrlinksComHandler(objects::SYRLINKS_COM_HANDLER);
 | 
			
		||||
  auto* syrlinksAssy = new SyrlinksAssembly(objects::SYRLINKS_ASSY);
 | 
			
		||||
  syrlinksAssy->connectModeTreeParent(satsystem::com::SUBSYSTEM);
 | 
			
		||||
  auto* syrlinksUartCookie =
 | 
			
		||||
      new SerialCookie(objects::SYRLINKS_HANDLER, q7s::UART_SYRLINKS_DEV, serial::SYRLINKS_BAUD,
 | 
			
		||||
                       syrlinks::MAX_REPLY_SIZE, UartModes::NON_CANONICAL);
 | 
			
		||||
  syrlinksUartCookie->setParityEven();
 | 
			
		||||
 | 
			
		||||
  new SyrlinksComHandler(objects::SYRLINKS_COM_HANDLER);
 | 
			
		||||
  auto* syrlinksAssy = new SyrlinksAssembly(objects::SYRLINKS_ASSY);
 | 
			
		||||
  syrlinksAssy->connectModeTreeParent(satsystem::com::SUBSYSTEM);
 | 
			
		||||
  auto syrlinksFdir = new SyrlinksFdir(objects::SYRLINKS_HANDLER);
 | 
			
		||||
  auto syrlinksHandler =
 | 
			
		||||
      new SyrlinksHandler(objects::SYRLINKS_HANDLER, objects::SYRLINKS_COM_HANDLER,
 | 
			
		||||
@@ -616,11 +612,11 @@ void ObjectFactory::createSyrlinksComponents(PowerSwitchIF* pwrSwitcher) {
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ObjectFactory::createPayloadComponents(LinuxLibgpioIF* gpioComIF, PowerSwitchIF& pwrSwitcher) {
 | 
			
		||||
void ObjectFactory::createPayloadComponents(LinuxLibgpioIF* gpioComIF, PowerSwitchIF& pwrSwitch) {
 | 
			
		||||
  using namespace gpio;
 | 
			
		||||
  std::stringstream consumer;
 | 
			
		||||
  auto* camSwitcher =
 | 
			
		||||
      new CamSwitcher(objects::CAM_SWITCHER, pwrSwitcher, power::PDU2_CH8_PAYLOAD_CAMERA);
 | 
			
		||||
      new CamSwitcher(objects::CAM_SWITCHER, pwrSwitch, power::PDU2_CH8_PAYLOAD_CAMERA);
 | 
			
		||||
  camSwitcher->connectModeTreeParent(satsystem::payload::SUBSYSTEM);
 | 
			
		||||
#if OBSW_ADD_PLOC_MPSOC == 1
 | 
			
		||||
  consumer << "0x" << std::hex << objects::PLOC_MPSOC_HANDLER;
 | 
			
		||||
@@ -629,15 +625,14 @@ void ObjectFactory::createPayloadComponents(LinuxLibgpioIF* gpioComIF, PowerSwit
 | 
			
		||||
  auto mpsocGpioCookie = new GpioCookie;
 | 
			
		||||
  mpsocGpioCookie->addGpio(gpioIds::ENABLE_MPSOC_UART, gpioConfigMPSoC);
 | 
			
		||||
  gpioChecker(gpioComIF->addGpios(mpsocGpioCookie), "PLOC MPSoC");
 | 
			
		||||
  SerialConfig serialCfg(q7s::UART_PLOC_MPSOC_DEV, serial::PLOC_MPSOC_BAUD, mpsoc::MAX_REPLY_SIZE,
 | 
			
		||||
                         UartModes::NON_CANONICAL);
 | 
			
		||||
  auto mpsocCommunication = new MpsocCommunication(objects::PLOC_MPSOC_COMMUNICATION, serialCfg);
 | 
			
		||||
  auto specialComHelper =
 | 
			
		||||
      new PlocMpsocSpecialComHelper(objects::PLOC_MPSOC_HELPER, *mpsocCommunication);
 | 
			
		||||
  DhbConfig dhbConf(objects::PLOC_MPSOC_HANDLER);
 | 
			
		||||
  auto* mpsocHandler = new FreshMpsocHandler(
 | 
			
		||||
      dhbConf, *mpsocCommunication, *specialComHelper, Gpio(gpioIds::ENABLE_MPSOC_UART, gpioComIF),
 | 
			
		||||
      objects::PLOC_SUPERVISOR_HANDLER, pwrSwitcher, power::PDU2_CH8_PAYLOAD_CAMERA);
 | 
			
		||||
  auto mpsocCookie =
 | 
			
		||||
      new SerialCookie(objects::PLOC_MPSOC_HANDLER, q7s::UART_PLOC_MPSOC_DEV,
 | 
			
		||||
                       serial::PLOC_MPSOC_BAUD, mpsoc::MAX_REPLY_SIZE, UartModes::NON_CANONICAL);
 | 
			
		||||
  mpsocCookie->setNoFixedSizeReply();
 | 
			
		||||
  auto plocMpsocHelper = new PlocMpsocSpecialComHelper(objects::PLOC_MPSOC_HELPER);
 | 
			
		||||
  auto* mpsocHandler = new PlocMpsocHandler(
 | 
			
		||||
      objects::PLOC_MPSOC_HANDLER, objects::UART_COM_IF, mpsocCookie, plocMpsocHelper,
 | 
			
		||||
      Gpio(gpioIds::ENABLE_MPSOC_UART, gpioComIF), objects::PLOC_SUPERVISOR_HANDLER);
 | 
			
		||||
  mpsocHandler->connectModeTreeParent(satsystem::payload::SUBSYSTEM);
 | 
			
		||||
#endif /* OBSW_ADD_PLOC_MPSOC == 1 */
 | 
			
		||||
#if OBSW_ADD_PLOC_SUPERVISOR == 1
 | 
			
		||||
@@ -647,19 +642,15 @@ void ObjectFactory::createPayloadComponents(LinuxLibgpioIF* gpioComIF, PowerSwit
 | 
			
		||||
  auto supvGpioCookie = new GpioCookie;
 | 
			
		||||
  supvGpioCookie->addGpio(gpioIds::ENABLE_SUPV_UART, gpioConfigSupv);
 | 
			
		||||
  gpioComIF->addGpios(supvGpioCookie);
 | 
			
		||||
  const char* plocSupvDev = q7s::UART_PLOC_SUPERVISOR_DEV;
 | 
			
		||||
  if (not std::filesystem::exists(plocSupvDev)) {
 | 
			
		||||
    plocSupvDev = q7s::UART_PLOC_SUPERVISOR_DEV_FALLBACK;
 | 
			
		||||
  }
 | 
			
		||||
  auto supervisorCookie =
 | 
			
		||||
      new SerialCookie(objects::PLOC_SUPERVISOR_HANDLER, plocSupvDev, serial::PLOC_SUPV_BAUD,
 | 
			
		||||
                       supv::MAX_PACKET_SIZE * 20, UartModes::NON_CANONICAL);
 | 
			
		||||
  auto supervisorCookie = new SerialCookie(objects::PLOC_SUPERVISOR_HANDLER,
 | 
			
		||||
                                           q7s::UART_PLOC_SUPERVSIOR_DEV, serial::PLOC_SUPV_BAUD,
 | 
			
		||||
                                           supv::MAX_PACKET_SIZE * 20, UartModes::NON_CANONICAL);
 | 
			
		||||
  supervisorCookie->setNoFixedSizeReply();
 | 
			
		||||
  new PlocSupvUartManager(objects::PLOC_SUPERVISOR_HELPER);
 | 
			
		||||
  dhbConf = DhbConfig(objects::PLOC_SUPERVISOR_HANDLER);
 | 
			
		||||
  auto* supvHandler =
 | 
			
		||||
      new FreshSupvHandler(dhbConf, supervisorCookie, Gpio(gpioIds::ENABLE_SUPV_UART, gpioComIF),
 | 
			
		||||
                           pwrSwitcher, power::PDU1_CH6_PLOC_12V);
 | 
			
		||||
  auto supvHelper = new PlocSupvUartManager(objects::PLOC_SUPERVISOR_HELPER);
 | 
			
		||||
  auto* supvHandler = new PlocSupervisorHandler(objects::PLOC_SUPERVISOR_HANDLER, supervisorCookie,
 | 
			
		||||
                                                Gpio(gpioIds::ENABLE_SUPV_UART, gpioComIF),
 | 
			
		||||
                                                power::PDU1_CH6_PLOC_12V, *supvHelper);
 | 
			
		||||
  supvHandler->setPowerSwitcher(&pwrSwitch);
 | 
			
		||||
  supvHandler->connectModeTreeParent(satsystem::payload::SUBSYSTEM);
 | 
			
		||||
#endif /* OBSW_ADD_PLOC_SUPERVISOR == 1 */
 | 
			
		||||
  static_cast<void>(consumer);
 | 
			
		||||
@@ -839,13 +830,13 @@ ReturnValue_t ObjectFactory::createCcsdsComponents(CcsdsComponentArgs& args) {
 | 
			
		||||
                                    Levels::LOW);
 | 
			
		||||
  gpioCookiePdec->addGpio(gpioIds::PDEC_RESET, gpio);
 | 
			
		||||
  gpioChecker(args.gpioComIF.addGpios(gpioCookiePdec), "PDEC");
 | 
			
		||||
  struct UioNames uioNames{};
 | 
			
		||||
  struct UioNames uioNames {};
 | 
			
		||||
  uioNames.configMemory = q7s::UIO_PDEC_CONFIG_MEMORY;
 | 
			
		||||
  uioNames.ramMemory = q7s::UIO_PDEC_RAM;
 | 
			
		||||
  uioNames.registers = q7s::UIO_PDEC_REGISTERS;
 | 
			
		||||
  uioNames.irq = q7s::UIO_PDEC_IRQ;
 | 
			
		||||
  new PdecHandler(objects::PDEC_HANDLER, objects::CCSDS_HANDLER, &args.gpioComIF,
 | 
			
		||||
                  gpioIds::PDEC_RESET, uioNames, args.pdecCfgMemBaseAddr, args.pdecRamBaseAddr);
 | 
			
		||||
                  gpioIds::PDEC_RESET, uioNames);
 | 
			
		||||
  GpioCookie* gpioRS485Chip = new GpioCookie;
 | 
			
		||||
  gpio = new GpiodRegularByLineName(q7s::gpioNames::RS485_EN_TX_CLOCK, "RS485 Transceiver",
 | 
			
		||||
                                    Direction::OUT, Levels::LOW);
 | 
			
		||||
@@ -940,7 +931,7 @@ void ObjectFactory::createTestComponents(LinuxLibgpioIF* gpioComIF) {
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ObjectFactory::createStrComponents(PowerSwitchIF* pwrSwitcher, SdCardManager& sdcMan) {
 | 
			
		||||
void ObjectFactory::createStrComponents(PowerSwitchIF* pwrSwitcher) {
 | 
			
		||||
  auto* strAssy = new StrAssembly(objects::STR_ASSY);
 | 
			
		||||
  strAssy->connectModeTreeParent(satsystem::acs::ACS_SUBSYSTEM);
 | 
			
		||||
  auto* starTrackerCookie =
 | 
			
		||||
@@ -954,10 +945,9 @@ void ObjectFactory::createStrComponents(PowerSwitchIF* pwrSwitcher, SdCardManage
 | 
			
		||||
    sif::error << "No valid Star Tracker parameter JSON file" << std::endl;
 | 
			
		||||
  }
 | 
			
		||||
  auto strFdir = new StrFdir(objects::STAR_TRACKER);
 | 
			
		||||
  auto cfgGetter = new StrConfigPathGetter(sdcMan);
 | 
			
		||||
  auto starTracker =
 | 
			
		||||
      new StarTrackerHandler(objects::STAR_TRACKER, objects::STR_COM_IF, starTrackerCookie,
 | 
			
		||||
                             strComIF, power::PDU1_CH2_STAR_TRACKER_5V, *cfgGetter, sdcMan);
 | 
			
		||||
                             paramJsonFile, strComIF, power::PDU1_CH2_STAR_TRACKER_5V);
 | 
			
		||||
  starTracker->setPowerSwitcher(pwrSwitcher);
 | 
			
		||||
  starTracker->connectModeTreeParent(*strAssy);
 | 
			
		||||
  starTracker->setCustomFdir(strFdir);
 | 
			
		||||
@@ -1072,13 +1062,7 @@ ReturnValue_t ObjectFactory::readFirmwareVersion() {
 | 
			
		||||
  return returnvalue::OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ReturnValue_t ObjectFactory::createCcsdsIpComponentsWrapper(CcsdsComponentArgs& ccsdsArgs) {
 | 
			
		||||
  ccsdsArgs.pdecCfgMemBaseAddr = config::pdec::PDEC_CONFIG_BASE_ADDR;
 | 
			
		||||
  ccsdsArgs.pdecRamBaseAddr = config::pdec::PDEC_RAM_ADDR;
 | 
			
		||||
  if (core::FW_VERSION_MAJOR < 6) {
 | 
			
		||||
    ccsdsArgs.pdecCfgMemBaseAddr = config::pdec::PDEC_CONFIG_BASE_ADDR_LEGACY;
 | 
			
		||||
    ccsdsArgs.pdecRamBaseAddr = config::pdec::PDEC_RAM_ADDR_LEGACY;
 | 
			
		||||
  }
 | 
			
		||||
ReturnValue_t ObjectFactory::createCcsdsIpComponentsAddTmRouting(CcsdsComponentArgs& ccsdsArgs) {
 | 
			
		||||
  ReturnValue_t result = createCcsdsComponents(ccsdsArgs);
 | 
			
		||||
#if OBSW_TM_TO_PTME == 1
 | 
			
		||||
  if (ccsdsArgs.normalLiveTmDest != MessageQueueIF::NO_QUEUE) {
 | 
			
		||||
 
 | 
			
		||||
@@ -15,8 +15,6 @@
 | 
			
		||||
#include <atomic>
 | 
			
		||||
#include <string>
 | 
			
		||||
 | 
			
		||||
#include "bsp_q7s/fs/SdCardManager.h"
 | 
			
		||||
 | 
			
		||||
class LinuxLibgpioIF;
 | 
			
		||||
class SerialComIF;
 | 
			
		||||
class SpiComIF;
 | 
			
		||||
@@ -33,17 +31,14 @@ namespace ObjectFactory {
 | 
			
		||||
struct CcsdsComponentArgs {
 | 
			
		||||
  CcsdsComponentArgs(LinuxLibgpioIF& gpioIF, StorageManagerIF& ipcStore, StorageManagerIF& tmStore,
 | 
			
		||||
                     PersistentTmStores& stores, PusTmFunnel& pusFunnel, CfdpTmFunnel& cfdpFunnel,
 | 
			
		||||
                     CcsdsIpCoreHandler** ipCoreHandler, uint32_t pdecCfgMemBaseAddr,
 | 
			
		||||
                     uint32_t pdecRamBaseAddr)
 | 
			
		||||
                     CcsdsIpCoreHandler** ipCoreHandler)
 | 
			
		||||
      : gpioComIF(gpioIF),
 | 
			
		||||
        ipcStore(ipcStore),
 | 
			
		||||
        tmStore(tmStore),
 | 
			
		||||
        stores(stores),
 | 
			
		||||
        pusFunnel(pusFunnel),
 | 
			
		||||
        cfdpFunnel(cfdpFunnel),
 | 
			
		||||
        ipCoreHandler(ipCoreHandler),
 | 
			
		||||
        pdecCfgMemBaseAddr(pdecCfgMemBaseAddr),
 | 
			
		||||
        pdecRamBaseAddr(pdecRamBaseAddr) {}
 | 
			
		||||
        ipCoreHandler(ipCoreHandler) {}
 | 
			
		||||
  LinuxLibgpioIF& gpioComIF;
 | 
			
		||||
  StorageManagerIF& ipcStore;
 | 
			
		||||
  StorageManagerIF& tmStore;
 | 
			
		||||
@@ -51,8 +46,6 @@ struct CcsdsComponentArgs {
 | 
			
		||||
  PusTmFunnel& pusFunnel;
 | 
			
		||||
  CfdpTmFunnel& cfdpFunnel;
 | 
			
		||||
  CcsdsIpCoreHandler** ipCoreHandler;
 | 
			
		||||
  uint32_t pdecCfgMemBaseAddr;
 | 
			
		||||
  uint32_t pdecRamBaseAddr;
 | 
			
		||||
  MessageQueueId_t normalLiveTmDest = MessageQueueIF::NO_QUEUE;
 | 
			
		||||
  MessageQueueId_t cfdpLiveTmDest = MessageQueueIF::NO_QUEUE;
 | 
			
		||||
};
 | 
			
		||||
@@ -77,12 +70,12 @@ void createHeaterComponents(GpioIF* gpioIF, PowerSwitchIF* pwrSwitcher, HealthTa
 | 
			
		||||
                            HeaterHandler*& heaterHandler);
 | 
			
		||||
void createImtqComponents(PowerSwitchIF* pwrSwitcher, bool enableHkSets, const char* i2cDev);
 | 
			
		||||
void createBpxBatteryComponent(bool enableHkSets, const char* i2cDev);
 | 
			
		||||
void createStrComponents(PowerSwitchIF* pwrSwitcher, SdCardManager& sdcMan);
 | 
			
		||||
void createStrComponents(PowerSwitchIF* pwrSwitcher);
 | 
			
		||||
void createSolarArrayDeploymentComponents(PowerSwitchIF& pwrSwitcher, GpioIF& gpioIF);
 | 
			
		||||
void createSyrlinksComponents(PowerSwitchIF* pwrSwitcher);
 | 
			
		||||
void createPayloadComponents(LinuxLibgpioIF* gpioComIF, PowerSwitchIF& pwrSwitcher);
 | 
			
		||||
void createReactionWheelComponents(LinuxLibgpioIF* gpioComIF, PowerSwitchIF* pwrSwitcher);
 | 
			
		||||
ReturnValue_t createCcsdsIpComponentsWrapper(CcsdsComponentArgs& args);
 | 
			
		||||
ReturnValue_t createCcsdsIpComponentsAddTmRouting(CcsdsComponentArgs& args);
 | 
			
		||||
ReturnValue_t createCcsdsComponents(CcsdsComponentArgs& args);
 | 
			
		||||
ReturnValue_t readFirmwareVersion();
 | 
			
		||||
void createMiscComponents();
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,6 @@
 | 
			
		||||
#include "obsw.h"
 | 
			
		||||
 | 
			
		||||
#include <libxiphos.h>
 | 
			
		||||
#include <pwd.h>
 | 
			
		||||
#include <sys/types.h>
 | 
			
		||||
#include <unistd.h>
 | 
			
		||||
@@ -13,6 +14,7 @@
 | 
			
		||||
#include "commonConfig.h"
 | 
			
		||||
#include "fsfw/tasks/TaskFactory.h"
 | 
			
		||||
#include "fsfw/version.h"
 | 
			
		||||
#include "memory/scratchApi.h"
 | 
			
		||||
#include "mission/acs/defs.h"
 | 
			
		||||
#include "mission/com/defs.h"
 | 
			
		||||
#include "mission/system/systemTree.h"
 | 
			
		||||
@@ -50,6 +52,8 @@ int obsw::obsw(int argc, char* argv[]) {
 | 
			
		||||
  }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  autoSwitchHandling();
 | 
			
		||||
 | 
			
		||||
  // Delay the boot if applicable.
 | 
			
		||||
  bootDelayHandling();
 | 
			
		||||
 | 
			
		||||
@@ -82,6 +86,33 @@ int obsw::obsw(int argc, char* argv[]) {
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void obsw::autoSwitchHandling() {
 | 
			
		||||
  std::string autoSwitchTarget;
 | 
			
		||||
  auto switchToTarget = [&](xsc_libnor_chip_t chip, xsc_libnor_copy_t copy) {
 | 
			
		||||
    sif::warning << "Detected ASWI=" << autoSwitchTarget
 | 
			
		||||
                 << " in ProASIC scratch buffer, auto-switching to image " << int(chip) << " "
 | 
			
		||||
                 << int(copy) << std::endl;
 | 
			
		||||
    scratch::clearValue(scratch::AUTO_SWITCH_IMAGE);
 | 
			
		||||
    // A bit of delay to ensure printout works..
 | 
			
		||||
    TaskFactory::delayTask(500);
 | 
			
		||||
    xsc_boot_copy(chip, copy);
 | 
			
		||||
  };
 | 
			
		||||
  if (scratch::readString(scratch::AUTO_SWITCH_IMAGE, autoSwitchTarget) == returnvalue::OK) {
 | 
			
		||||
    if (autoSwitchTarget == "00") {
 | 
			
		||||
      switchToTarget(XSC_LIBNOR_CHIP_0, XSC_LIBNOR_COPY_NOMINAL);
 | 
			
		||||
    } else if (autoSwitchTarget == "01") {
 | 
			
		||||
      switchToTarget(XSC_LIBNOR_CHIP_0, XSC_LIBNOR_COPY_GOLD);
 | 
			
		||||
    } else if (autoSwitchTarget == "10") {
 | 
			
		||||
      switchToTarget(XSC_LIBNOR_CHIP_1, XSC_LIBNOR_COPY_NOMINAL);
 | 
			
		||||
    } else if (autoSwitchTarget == "11") {
 | 
			
		||||
      switchToTarget(XSC_LIBNOR_CHIP_1, XSC_LIBNOR_COPY_GOLD);
 | 
			
		||||
    } else {
 | 
			
		||||
      sif::warning << "Invalid Auto Switch Image (ASWI) value detected: " << autoSwitchTarget
 | 
			
		||||
                   << std::endl;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void obsw::bootDelayHandling() {
 | 
			
		||||
  const char* homedir = nullptr;
 | 
			
		||||
  homedir = getenv("HOME");
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,12 @@ namespace obsw {
 | 
			
		||||
 | 
			
		||||
int obsw(int argc, char* argv[]);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This is a safety mechanism where the ProASIC scratch buffer can be used to trigger an
 | 
			
		||||
 * auto-boot to another image. The auto-boot is currently implemented as a one-shot mechanism:
 | 
			
		||||
 * The key-value pair which triggers the auto-boot will be removed from the scratch buffer.
 | 
			
		||||
 */
 | 
			
		||||
void autoSwitchHandling();
 | 
			
		||||
void bootDelayHandling();
 | 
			
		||||
void commandEiveSystemToSafe();
 | 
			
		||||
void commandComSubsystemRxOnly();
 | 
			
		||||
 
 | 
			
		||||
@@ -383,9 +383,11 @@ void scheduling::initTasks() {
 | 
			
		||||
  }
 | 
			
		||||
#endif /* OBSW_ADD_PLOC_SUPERVISOR */
 | 
			
		||||
 | 
			
		||||
  FixedTimeslotTaskIF* plTask = factory->createFixedTimeslotTask(
 | 
			
		||||
      "PL_TASK", 25, PeriodicTaskIF::MINIMUM_STACK_SIZE, 0.5, missedDeadlineFunc);
 | 
			
		||||
  pst::pstPayload(plTask);
 | 
			
		||||
  PeriodicTaskIF* plTask = factory->createPeriodicTask(
 | 
			
		||||
      "PL_TASK", 25, PeriodicTaskIF::MINIMUM_STACK_SIZE, 0.5, missedDeadlineFunc, &RR_SCHEDULING);
 | 
			
		||||
  plTask->addComponent(objects::CAM_SWITCHER);
 | 
			
		||||
  scheduling::addMpsocSupvHandlers(plTask);
 | 
			
		||||
  scheduling::scheduleScexDev(plTask);
 | 
			
		||||
 | 
			
		||||
#if OBSW_ADD_SCEX_DEVICE == 1
 | 
			
		||||
  PeriodicTaskIF* scexReaderTask;
 | 
			
		||||
 
 | 
			
		||||
@@ -10,9 +10,7 @@
 | 
			
		||||
int simple::simple() {
 | 
			
		||||
  std::cout << "-- Q7S Simple Application --" << std::endl;
 | 
			
		||||
#if Q7S_SIMPLE_ADD_FILE_SYSTEM_TEST == 1
 | 
			
		||||
  {
 | 
			
		||||
    FileSystemTest fileSystemTest;
 | 
			
		||||
  }
 | 
			
		||||
  { FileSystemTest fileSystemTest; }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if TE0720_GPIO_TEST
 | 
			
		||||
 
 | 
			
		||||
@@ -24,8 +24,6 @@ if [ ! -z "${EIVE_Q7S_EM}" ]; then
 | 
			
		||||
    build_defs="EIVE_Q7S_EM=ON"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
build_defs="${build_defs} CMAKE_EXPORT_COMPILE_COMMANDS=ON" 
 | 
			
		||||
 | 
			
		||||
os_fsfw="linux"
 | 
			
		||||
tgt_bsp="arm/q7s"
 | 
			
		||||
build_dir="cmake-build-debug-q7s"
 | 
			
		||||
 
 | 
			
		||||
@@ -24,8 +24,6 @@ if [ ! -z "${EIVE_Q7S_EM}" ]; then
 | 
			
		||||
    build_defs="EIVE_Q7S_EM=ON"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
build_defs="${build_defs} CMAKE_EXPORT_COMPILE_COMMANDS=ON" 
 | 
			
		||||
 | 
			
		||||
os_fsfw="linux"
 | 
			
		||||
tgt_bsp="arm/q7s"
 | 
			
		||||
build_dir="cmake-build-release-q7s"
 | 
			
		||||
 
 | 
			
		||||
@@ -20,9 +20,6 @@ static constexpr char OBSW_VERSION_FILE_PATH[] = "/usr/share/eive-obsw/obsw_vers
 | 
			
		||||
// ISO8601 timestamp.
 | 
			
		||||
static constexpr char FILE_DATE_FORMAT[] = "%FT%H%M%SZ";
 | 
			
		||||
 | 
			
		||||
// Leap Seconds as of 2024-03-04
 | 
			
		||||
static constexpr uint16_t LEAP_SECONDS = 37;
 | 
			
		||||
 | 
			
		||||
static constexpr uint16_t EIVE_PUS_APID = 0x65;
 | 
			
		||||
static constexpr uint16_t EIVE_CFDP_APID = 0x66;
 | 
			
		||||
static constexpr uint16_t EIVE_LOCAL_CFDP_ENTITY_ID = EIVE_CFDP_APID;
 | 
			
		||||
@@ -118,18 +115,6 @@ static constexpr float SCHED_BLOCK_10_PERIOD =
 | 
			
		||||
 | 
			
		||||
}  // namespace spiSched
 | 
			
		||||
 | 
			
		||||
namespace pdec {
 | 
			
		||||
 | 
			
		||||
// Pre FW v6.0.0
 | 
			
		||||
static constexpr uint32_t PDEC_CONFIG_BASE_ADDR_LEGACY = 0x24000000;
 | 
			
		||||
static constexpr uint32_t PDEC_RAM_ADDR_LEGACY = 0x26000000;
 | 
			
		||||
 | 
			
		||||
// Post FW v6.0.0
 | 
			
		||||
static constexpr uint32_t PDEC_CONFIG_BASE_ADDR = 0x4000000;
 | 
			
		||||
static constexpr uint32_t PDEC_RAM_ADDR = 0x7000000;
 | 
			
		||||
 | 
			
		||||
}  // namespace pdec
 | 
			
		||||
 | 
			
		||||
}  // namespace config
 | 
			
		||||
 | 
			
		||||
#endif /* COMMON_CONFIG_DEFINITIONS_H_ */
 | 
			
		||||
 
 | 
			
		||||
@@ -77,7 +77,6 @@ enum commonObjects : uint32_t {
 | 
			
		||||
  PLOC_MPSOC_HANDLER = 0x44330015,
 | 
			
		||||
  PLOC_SUPERVISOR_HANDLER = 0x44330016,
 | 
			
		||||
  PLOC_SUPERVISOR_HELPER = 0x44330017,
 | 
			
		||||
  PLOC_MPSOC_COMMUNICATION = 0x44330018,
 | 
			
		||||
  SCEX = 0x44330032,
 | 
			
		||||
  SOLAR_ARRAY_DEPL_HANDLER = 0x444100A2,
 | 
			
		||||
  HEATER_HANDLER = 0x444100A4,
 | 
			
		||||
 
 | 
			
		||||
@@ -42,7 +42,6 @@ enum commonClassIds : uint8_t {
 | 
			
		||||
  PERSISTENT_TM_STORE,      // PTM
 | 
			
		||||
  TM_SINK,                  // TMS
 | 
			
		||||
  VIRTUAL_CHANNEL,          // VCS
 | 
			
		||||
  PLOC_MPSOC_COM,           // PLMPCOM
 | 
			
		||||
  COMMON_CLASS_ID_END       // [EXPORT] : [END]
 | 
			
		||||
};
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,54 +0,0 @@
 | 
			
		||||
#include "BatteryDummy.h"
 | 
			
		||||
 | 
			
		||||
BatteryDummy::BatteryDummy(DhbConfig cfg)
 | 
			
		||||
    : FreshDeviceHandlerBase(cfg), cfgSet(this), hkSet(this) {}
 | 
			
		||||
 | 
			
		||||
void BatteryDummy::performDeviceOperation(uint8_t opCode) {}
 | 
			
		||||
 | 
			
		||||
LocalPoolDataSetBase* BatteryDummy::getDataSetHandle(sid_t sid) {
 | 
			
		||||
  if (sid == hkSet.getSid()) {
 | 
			
		||||
    return &hkSet;
 | 
			
		||||
  }
 | 
			
		||||
  if (sid == cfgSet.getSid()) {
 | 
			
		||||
    return &cfgSet;
 | 
			
		||||
  }
 | 
			
		||||
  return nullptr;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ReturnValue_t BatteryDummy::initializeLocalDataPool(localpool::DataPool& localDataPoolMap,
 | 
			
		||||
                                                    LocalDataPoolManager& poolManager) {
 | 
			
		||||
  localDataPoolMap.emplace(bpxBat::BATT_TEMP_1, &battTemp1);
 | 
			
		||||
  localDataPoolMap.emplace(bpxBat::BATT_TEMP_2, &battTemp2);
 | 
			
		||||
  localDataPoolMap.emplace(bpxBat::BATT_TEMP_3, &battTemp3);
 | 
			
		||||
  localDataPoolMap.emplace(bpxBat::BATT_TEMP_4, &battTemp4);
 | 
			
		||||
  localDataPoolMap.emplace(bpxBat::CHARGE_CURRENT, &chargeCurrent);
 | 
			
		||||
  localDataPoolMap.emplace(bpxBat::DISCHARGE_CURRENT, &dischargeCurrent);
 | 
			
		||||
  localDataPoolMap.emplace(bpxBat::HEATER_CURRENT, &heaterCurrent);
 | 
			
		||||
  localDataPoolMap.emplace(bpxBat::BATT_VOLTAGE, &battVolt);
 | 
			
		||||
  localDataPoolMap.emplace(bpxBat::REBOOT_COUNTER, &rebootCounter);
 | 
			
		||||
  localDataPoolMap.emplace(bpxBat::BOOTCAUSE, &bootCause);
 | 
			
		||||
 | 
			
		||||
  localDataPoolMap.emplace(bpxBat::BATTERY_HEATER_MODE, &battheatMode);
 | 
			
		||||
  localDataPoolMap.emplace(bpxBat::BATTHEAT_LOW_LIMIT, &battheatLow);
 | 
			
		||||
  localDataPoolMap.emplace(bpxBat::BATTHEAT_HIGH_LIMIT, &battheatHigh);
 | 
			
		||||
 | 
			
		||||
  poolManager.subscribeForRegularPeriodicPacket(
 | 
			
		||||
      subdp::RegularHkPeriodicParams(hkSet.getSid(), true, 20.0));
 | 
			
		||||
  poolManager.subscribeForRegularPeriodicPacket(
 | 
			
		||||
      subdp::RegularHkPeriodicParams(cfgSet.getSid(), false, 30.0));
 | 
			
		||||
  return returnvalue::OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ReturnValue_t BatteryDummy::checkModeCommand(Mode_t mode, Submode_t submode,
 | 
			
		||||
                                             uint32_t* msToReachTheMode) {
 | 
			
		||||
  return returnvalue::OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ReturnValue_t BatteryDummy::executeAction(ActionId_t actionId, MessageQueueId_t commandedBy,
 | 
			
		||||
                                          const uint8_t* data, size_t size) {
 | 
			
		||||
  return returnvalue::OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ReturnValue_t BatteryDummy::handleCommandMessage(CommandMessage* message) {
 | 
			
		||||
  return returnvalue::FAILED;
 | 
			
		||||
}
 | 
			
		||||
@@ -1,52 +0,0 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include "fsfw/devicehandlers/FreshDeviceHandlerBase.h"
 | 
			
		||||
#include "mission/power/bpxBattDefs.h"
 | 
			
		||||
 | 
			
		||||
/// @brief
 | 
			
		||||
class BatteryDummy : public FreshDeviceHandlerBase {
 | 
			
		||||
 public:
 | 
			
		||||
  BatteryDummy(DhbConfig cfg);
 | 
			
		||||
 | 
			
		||||
 private:
 | 
			
		||||
  /**
 | 
			
		||||
   * Periodic helper executed function, implemented by child class.
 | 
			
		||||
   */
 | 
			
		||||
  void performDeviceOperation(uint8_t opCode) override;
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Implemented by child class. Handle all command messages which are
 | 
			
		||||
   * not health, mode, action or housekeeping messages.
 | 
			
		||||
   * @param message
 | 
			
		||||
   * @return
 | 
			
		||||
   */
 | 
			
		||||
  ReturnValue_t handleCommandMessage(CommandMessage* message) override;
 | 
			
		||||
 | 
			
		||||
  // HK manager abstract functions.
 | 
			
		||||
  LocalPoolDataSetBase* getDataSetHandle(sid_t sid) override;
 | 
			
		||||
  ReturnValue_t initializeLocalDataPool(localpool::DataPool& localDataPoolMap,
 | 
			
		||||
                                        LocalDataPoolManager& poolManager) override;
 | 
			
		||||
 | 
			
		||||
  // Mode abstract functions
 | 
			
		||||
  ReturnValue_t checkModeCommand(Mode_t mode, Submode_t submode,
 | 
			
		||||
                                 uint32_t* msToReachTheMode) override;
 | 
			
		||||
  // Action override. Forward to user.
 | 
			
		||||
  ReturnValue_t executeAction(ActionId_t actionId, MessageQueueId_t commandedBy,
 | 
			
		||||
                              const uint8_t* data, size_t size) override;
 | 
			
		||||
 | 
			
		||||
  BpxBatteryCfg cfgSet;
 | 
			
		||||
  BpxBatteryHk hkSet;
 | 
			
		||||
  PoolEntry<uint16_t> chargeCurrent = PoolEntry<uint16_t>({0});
 | 
			
		||||
  PoolEntry<uint16_t> dischargeCurrent = PoolEntry<uint16_t>({0});
 | 
			
		||||
  PoolEntry<uint16_t> heaterCurrent = PoolEntry<uint16_t>({0});
 | 
			
		||||
  PoolEntry<uint16_t> battVolt = PoolEntry<uint16_t>({16'000});
 | 
			
		||||
  PoolEntry<int16_t> battTemp1 = PoolEntry<int16_t>({10}, true);
 | 
			
		||||
  PoolEntry<int16_t> battTemp2 = PoolEntry<int16_t>({10}, true);
 | 
			
		||||
  PoolEntry<int16_t> battTemp3 = PoolEntry<int16_t>({10}, true);
 | 
			
		||||
  PoolEntry<int16_t> battTemp4 = PoolEntry<int16_t>({10}, true);
 | 
			
		||||
  PoolEntry<uint32_t> rebootCounter = PoolEntry<uint32_t>({0});
 | 
			
		||||
  PoolEntry<uint8_t> bootCause = PoolEntry<uint8_t>({0});
 | 
			
		||||
  PoolEntry<uint8_t> battheatMode = PoolEntry<uint8_t>({0});
 | 
			
		||||
  PoolEntry<int8_t> battheatLow = PoolEntry<int8_t>({0});
 | 
			
		||||
  PoolEntry<int8_t> battheatHigh = PoolEntry<int8_t>({0});
 | 
			
		||||
};
 | 
			
		||||
@@ -29,5 +29,4 @@ target_sources(
 | 
			
		||||
         PlocSupervisorDummy.cpp
 | 
			
		||||
         helperFactory.cpp
 | 
			
		||||
         MgmRm3100Dummy.cpp
 | 
			
		||||
         BatteryDummy.cpp
 | 
			
		||||
         Tmp1075Dummy.cpp)
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
#define DUMMIES_GPSCTRLDUMMY_H_
 | 
			
		||||
 | 
			
		||||
#include <fsfw/controller/ExtendedControllerBase.h>
 | 
			
		||||
#include <linux/acs/GPSDefinitions.h>
 | 
			
		||||
#include <mission/acs/archive/GPSDefinitions.h>
 | 
			
		||||
 | 
			
		||||
class GpsCtrlDummy : public ExtendedControllerBase {
 | 
			
		||||
 public:
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
#include <dummies/GpsDhbDummy.h>
 | 
			
		||||
#include <linux/acs/GPSDefinitions.h>
 | 
			
		||||
#include <mission/acs/archive/GPSDefinitions.h>
 | 
			
		||||
 | 
			
		||||
GpsDhbDummy::GpsDhbDummy(object_id_t objectId, object_id_t comif, CookieIF *comCookie)
 | 
			
		||||
    : DeviceHandlerBase(objectId, comif, comCookie) {}
 | 
			
		||||
 
 | 
			
		||||
@@ -2,15 +2,14 @@
 | 
			
		||||
 | 
			
		||||
#include <mission/com/syrlinksDefs.h>
 | 
			
		||||
 | 
			
		||||
SyrlinksDummy::SyrlinksDummy(object_id_t objectId, object_id_t comif, CookieIF *comCookie,
 | 
			
		||||
                             DeviceHandlerFailureIsolation *fdir)
 | 
			
		||||
    : DeviceHandlerBase(objectId, comif, comCookie, fdir) {}
 | 
			
		||||
SyrlinksDummy::SyrlinksDummy(object_id_t objectId, object_id_t comif, CookieIF *comCookie)
 | 
			
		||||
    : DeviceHandlerBase(objectId, comif, comCookie) {}
 | 
			
		||||
 | 
			
		||||
SyrlinksDummy::~SyrlinksDummy() {}
 | 
			
		||||
 | 
			
		||||
void SyrlinksDummy::doStartUp() { setMode(MODE_ON); }
 | 
			
		||||
void SyrlinksDummy::doStartUp() {}
 | 
			
		||||
 | 
			
		||||
void SyrlinksDummy::doShutDown() { setMode(MODE_OFF); }
 | 
			
		||||
void SyrlinksDummy::doShutDown() {}
 | 
			
		||||
 | 
			
		||||
ReturnValue_t SyrlinksDummy::buildNormalDeviceCommand(DeviceCommandId_t *id) {
 | 
			
		||||
  return NOTHING_TO_SEND;
 | 
			
		||||
@@ -37,7 +36,7 @@ ReturnValue_t SyrlinksDummy::interpretDeviceReply(DeviceCommandId_t id, const ui
 | 
			
		||||
 | 
			
		||||
void SyrlinksDummy::fillCommandAndReplyMap() {}
 | 
			
		||||
 | 
			
		||||
uint32_t SyrlinksDummy::getTransitionDelayMs(Mode_t modeFrom, Mode_t modeTo) { return 1000; }
 | 
			
		||||
uint32_t SyrlinksDummy::getTransitionDelayMs(Mode_t modeFrom, Mode_t modeTo) { return 500; }
 | 
			
		||||
 | 
			
		||||
ReturnValue_t SyrlinksDummy::initializeLocalDataPool(localpool::DataPool &localDataPoolMap,
 | 
			
		||||
                                                     LocalDataPoolManager &poolManager) {
 | 
			
		||||
 
 | 
			
		||||
@@ -11,8 +11,7 @@ class SyrlinksDummy : public DeviceHandlerBase {
 | 
			
		||||
  static const uint8_t SIMPLE_COMMAND_DATA = 1;
 | 
			
		||||
  static const uint8_t PERIODIC_REPLY_DATA = 2;
 | 
			
		||||
 | 
			
		||||
  SyrlinksDummy(object_id_t objectId, object_id_t comif, CookieIF *comCookie,
 | 
			
		||||
                DeviceHandlerFailureIsolation *fdir);
 | 
			
		||||
  SyrlinksDummy(object_id_t objectId, object_id_t comif, CookieIF *comCookie);
 | 
			
		||||
  virtual ~SyrlinksDummy();
 | 
			
		||||
 | 
			
		||||
 protected:
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,6 @@
 | 
			
		||||
#include "helperFactory.h"
 | 
			
		||||
 | 
			
		||||
#include <dummies/AcuDummy.h>
 | 
			
		||||
#include <dummies/BatteryDummy.h>
 | 
			
		||||
#include <dummies/BpxDummy.h>
 | 
			
		||||
#include <dummies/ComCookieDummy.h>
 | 
			
		||||
#include <dummies/ComIFDummy.h>
 | 
			
		||||
@@ -31,8 +30,6 @@
 | 
			
		||||
#include <mission/power/gsDefs.h>
 | 
			
		||||
#include <mission/system/acs/ImtqAssembly.h>
 | 
			
		||||
#include <mission/system/acs/StrAssembly.h>
 | 
			
		||||
#include <mission/system/com/SyrlinksAssembly.h>
 | 
			
		||||
#include <mission/system/com/SyrlinksFdir.h>
 | 
			
		||||
#include <mission/system/objects/CamSwitcher.h>
 | 
			
		||||
#include <mission/system/tcs/TcsBoardAssembly.h>
 | 
			
		||||
 | 
			
		||||
@@ -43,8 +40,8 @@
 | 
			
		||||
#include "mission/genericFactory.h"
 | 
			
		||||
#include "mission/system/acs/acsModeTree.h"
 | 
			
		||||
#include "mission/system/com/comModeTree.h"
 | 
			
		||||
#include "mission/system/payload/payloadModeTree.h"
 | 
			
		||||
#include "mission/system/tcs/tcsModeTree.h"
 | 
			
		||||
#include "mission/system/tree/payloadModeTree.h"
 | 
			
		||||
#include "mission/tcs/defs.h"
 | 
			
		||||
 | 
			
		||||
void dummy::createDummies(DummyCfg cfg, PowerSwitchIF& pwrSwitcher, GpioIF* gpioIF,
 | 
			
		||||
@@ -52,7 +49,7 @@ void dummy::createDummies(DummyCfg cfg, PowerSwitchIF& pwrSwitcher, GpioIF* gpio
 | 
			
		||||
  new ComIFDummy(objects::DUMMY_COM_IF);
 | 
			
		||||
  auto* comCookieDummy = new ComCookieDummy();
 | 
			
		||||
  if (cfg.addBpxBattDummy) {
 | 
			
		||||
    new BatteryDummy(DhbConfig(objects::BPX_BATT_HANDLER));
 | 
			
		||||
    new BpxDummy(objects::BPX_BATT_HANDLER, objects::DUMMY_COM_IF, comCookieDummy);
 | 
			
		||||
  }
 | 
			
		||||
  if (cfg.addCoreCtrlCfg) {
 | 
			
		||||
    new CoreControllerDummy(objects::CORE_CONTROLLER);
 | 
			
		||||
@@ -77,13 +74,9 @@ void dummy::createDummies(DummyCfg cfg, PowerSwitchIF& pwrSwitcher, GpioIF* gpio
 | 
			
		||||
    strDummy->connectModeTreeParent(*strAssy);
 | 
			
		||||
  }
 | 
			
		||||
  if (cfg.addSyrlinksDummies) {
 | 
			
		||||
    auto* syrlinksAssy = new SyrlinksAssembly(objects::SYRLINKS_ASSY);
 | 
			
		||||
    syrlinksAssy->connectModeTreeParent(satsystem::com::SUBSYSTEM);
 | 
			
		||||
 | 
			
		||||
    auto syrlinksFdir = new SyrlinksFdir(objects::SYRLINKS_HANDLER);
 | 
			
		||||
    auto* syrlinksDummy = new SyrlinksDummy(objects::SYRLINKS_HANDLER, objects::DUMMY_COM_IF,
 | 
			
		||||
                                            comCookieDummy, syrlinksFdir);
 | 
			
		||||
    syrlinksDummy->connectModeTreeParent(*syrlinksAssy);
 | 
			
		||||
    auto* syrlinksDummy =
 | 
			
		||||
        new SyrlinksDummy(objects::SYRLINKS_HANDLER, objects::DUMMY_COM_IF, comCookieDummy);
 | 
			
		||||
    syrlinksDummy->connectModeTreeParent(satsystem::com::SUBSYSTEM);
 | 
			
		||||
  }
 | 
			
		||||
  auto* imtqAssy = new ImtqAssembly(objects::IMTQ_ASSY);
 | 
			
		||||
  imtqAssy->connectModeTreeParent(satsystem::acs::ACS_SUBSYSTEM);
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								fsfw
									
									
									
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								fsfw
									
									
									
									
									
								
							 Submodule fsfw updated: 42867ad0cb...cc3e64e70d
									
								
							@@ -75,12 +75,9 @@ Event ID (dec); Event ID (hex); Name; Severity; Description; File Path
 | 
			
		||||
7902;0x1ede;BIT_LOCK;INFO;A Bit Lock signal. Was detected. P1: raw BLO state, P2: 0;fsfw/src/fsfw/datalinklayer/DataLinkLayer.h
 | 
			
		||||
7903;0x1edf;BIT_LOCK_LOST;INFO;A previously found Bit Lock signal was lost. P1: raw BLO state, P2: 0;fsfw/src/fsfw/datalinklayer/DataLinkLayer.h
 | 
			
		||||
7905;0x1ee1;FRAME_PROCESSING_FAILED;LOW;The CCSDS Board could not interpret a TC;fsfw/src/fsfw/datalinklayer/DataLinkLayer.h
 | 
			
		||||
8900;0x22c4;CLOCK_SET;INFO;Clock has been set. P1: old timeval seconds. P2: new timeval seconds.;fsfw/src/fsfw/pus/Service9TimeManagement.h
 | 
			
		||||
8901;0x22c5;CLOCK_DUMP_LEGACY;INFO;Clock dump event. P1: timeval seconds P2: timeval milliseconds.;fsfw/src/fsfw/pus/Service9TimeManagement.h
 | 
			
		||||
8902;0x22c6;CLOCK_SET_FAILURE;LOW;Clock could not be set. P1: Returncode.;fsfw/src/fsfw/pus/Service9TimeManagement.h
 | 
			
		||||
8903;0x22c7;CLOCK_DUMP;INFO;Clock dump event. P1: timeval seconds P2: timeval microseconds.;fsfw/src/fsfw/pus/Service9TimeManagement.h
 | 
			
		||||
8904;0x22c8;CLOCK_DUMP_BEFORE_SETTING_TIME;INFO;No description;fsfw/src/fsfw/pus/Service9TimeManagement.h
 | 
			
		||||
8905;0x22c9;CLOCK_DUMP_AFTER_SETTING_TIME;INFO;No description;fsfw/src/fsfw/pus/Service9TimeManagement.h
 | 
			
		||||
8900;0x22c4;CLOCK_SET;INFO;No description;fsfw/src/fsfw/pus/Service9TimeManagement.h
 | 
			
		||||
8901;0x22c5;CLOCK_DUMP;INFO;No description;fsfw/src/fsfw/pus/Service9TimeManagement.h
 | 
			
		||||
8902;0x22c6;CLOCK_SET_FAILURE;LOW;No description;fsfw/src/fsfw/pus/Service9TimeManagement.h
 | 
			
		||||
9100;0x238c;TC_DELETION_FAILED;MEDIUM;Deletion of a TC from the map failed. P1: First 32 bit of request ID, P2. Last 32 bit of Request ID;fsfw/src/fsfw/pus/Service11TelecommandScheduling.h
 | 
			
		||||
9700;0x25e4;TEST;INFO;No description;fsfw/src/fsfw/pus/Service17Test.h
 | 
			
		||||
10600;0x2968;CHANGE_OF_SETUP_PARAMETER;LOW;No description;fsfw/src/fsfw_hal/devicehandlers/MgmLIS3MDLHandler.h
 | 
			
		||||
@@ -91,17 +88,14 @@ Event ID (dec); Event ID (hex); Name; Severity; Description; File Path
 | 
			
		||||
10804;0x2a34;FILENAME_TOO_LARGE_ERROR;LOW;P1: Transaction step ID, P2: 0 for source file name, 1 for dest file name;fsfw/src/fsfw/cfdp/handler/defs.h
 | 
			
		||||
10805;0x2a35;HANDLING_CFDP_REQUEST_FAILED;LOW;CFDP request handling failed. P2: Returncode.;fsfw/src/fsfw/cfdp/handler/defs.h
 | 
			
		||||
11200;0x2bc0;SAFE_RATE_VIOLATION;MEDIUM;The limits for the rotation in safe mode were violated.;mission/acs/defs.h
 | 
			
		||||
11201;0x2bc1;RATE_RECOVERY;MEDIUM;The system has recovered from a rate rotation violation.;mission/acs/defs.h
 | 
			
		||||
11201;0x2bc1;SAFE_RATE_RECOVERY;MEDIUM;The system has recovered from a safe rate rotation violation.;mission/acs/defs.h
 | 
			
		||||
11202;0x2bc2;MULTIPLE_RW_INVALID;HIGH;Multiple RWs are invalid, uncommandable and therefore higher ACS modes cannot be maintained.;mission/acs/defs.h
 | 
			
		||||
11203;0x2bc3;MEKF_INVALID_INFO;INFO;MEKF was not able to compute a solution. P1: MEKF state on exit;mission/acs/defs.h
 | 
			
		||||
11204;0x2bc4;MEKF_RECOVERY;INFO;MEKF is able to compute a solution again.;mission/acs/defs.h
 | 
			
		||||
11205;0x2bc5;MEKF_AUTOMATIC_RESET;INFO;MEKF performed an automatic reset after detection of nonfinite values.;mission/acs/defs.h
 | 
			
		||||
11206;0x2bc6;PTG_CTRL_NO_ATTITUDE_INFORMATION;HIGH;For a prolonged time, no attitude information was available for the Pointing Controller. Falling back to Safe Mode.;mission/acs/defs.h
 | 
			
		||||
11206;0x2bc6;MEKF_INVALID_MODE_VIOLATION;HIGH;MEKF was not able to compute a solution during any pointing ACS mode for a prolonged time.;mission/acs/defs.h
 | 
			
		||||
11207;0x2bc7;SAFE_MODE_CONTROLLER_FAILURE;HIGH;The ACS safe mode controller was not able to compute a solution and has failed. P1: Missing information about magnetic field, P2: Missing information about rotational rate;mission/acs/defs.h
 | 
			
		||||
11208;0x2bc8;TLE_TOO_OLD;INFO;The TLE for the SGP4 Propagator has become too old.;mission/acs/defs.h
 | 
			
		||||
11209;0x2bc9;TLE_FILE_READ_FAILED;LOW;The TLE could not be read from the filesystem.;mission/acs/defs.h
 | 
			
		||||
11210;0x2bca;PTG_RATE_VIOLATION;MEDIUM;The limits for the rotation in pointing mode were violated.;mission/acs/defs.h
 | 
			
		||||
11211;0x2bcb;DETUMBLE_TRANSITION_FAILED;HIGH;The detumble transition has failed. //! P1: Last detumble state before failure.;mission/acs/defs.h
 | 
			
		||||
11300;0x2c24;SWITCH_CMD_SENT;INFO;Indicates that a FSFW object requested setting a switch P1: 1 if on was requested, 0 for off | P2: Switch Index;mission/power/defs.h
 | 
			
		||||
11301;0x2c25;SWITCH_HAS_CHANGED;INFO;Indicated that a switch state has changed P1: New switch state, 1 for on, 0 for off | P2: Switch Index;mission/power/defs.h
 | 
			
		||||
11302;0x2c26;SWITCHING_Q7S_DENIED;MEDIUM;No description;mission/power/defs.h
 | 
			
		||||
@@ -128,15 +122,14 @@ Event ID (dec); Event ID (hex); Name; Severity; Description; File Path
 | 
			
		||||
11506;0x2cf2;DEPL_SA1_GPIO_SWTICH_OFF_FAILED;HIGH;No description;mission/SolarArrayDeploymentHandler.h
 | 
			
		||||
11507;0x2cf3;DEPL_SA2_GPIO_SWTICH_OFF_FAILED;HIGH;No description;mission/SolarArrayDeploymentHandler.h
 | 
			
		||||
11508;0x2cf4;AUTONOMOUS_DEPLOYMENT_COMPLETED;INFO;No description;mission/SolarArrayDeploymentHandler.h
 | 
			
		||||
11601;0x2d51;MEMORY_READ_RPT_CRC_FAILURE;LOW;PLOC crc failure in telemetry packet;linux/payload/plocMpsocHelpers.h
 | 
			
		||||
11602;0x2d52;ACK_FAILURE;LOW;PLOC receive acknowledgment failure report P1: Command Id which leads the acknowledgment failure report P2: The status field inserted by the MPSoC into the data field;linux/payload/plocMpsocHelpers.h
 | 
			
		||||
11603;0x2d53;EXE_FAILURE;LOW;PLOC receive execution failure report P1: Command Id which leads the execution failure report P2: The status field inserted by the MPSoC into the data field;linux/payload/plocMpsocHelpers.h
 | 
			
		||||
11604;0x2d54;MPSOC_HANDLER_CRC_FAILURE;LOW;PLOC reply has invalid crc;linux/payload/plocMpsocHelpers.h
 | 
			
		||||
11605;0x2d55;MPSOC_HANDLER_SEQUENCE_COUNT_MISMATCH;LOW;Packet sequence count in received space packet does not match expected count P1: Expected sequence count P2: Received sequence count;linux/payload/plocMpsocHelpers.h
 | 
			
		||||
11606;0x2d56;MPSOC_SHUTDOWN_FAILED;HIGH;Supervisor fails to shutdown MPSoC. Requires to power off the PLOC and thus also to shutdown the supervisor.;linux/payload/plocMpsocHelpers.h
 | 
			
		||||
11607;0x2d57;SUPV_NOT_ON;LOW;SUPV not on for boot or shutdown process. P1: 0 for OFF transition, 1 for ON transition.;linux/payload/plocMpsocHelpers.h
 | 
			
		||||
11608;0x2d58;SUPV_REPLY_TIMEOUT;LOW;SUPV reply timeout.;linux/payload/plocMpsocHelpers.h
 | 
			
		||||
11609;0x2d59;CAM_MUST_BE_ON_FOR_SNAPSHOT_MODE;LOW;Camera must be commanded on first.;linux/payload/plocMpsocHelpers.h
 | 
			
		||||
11601;0x2d51;MEMORY_READ_RPT_CRC_FAILURE;LOW;PLOC crc failure in telemetry packet;linux/payload/PlocMpsocHandler.h
 | 
			
		||||
11602;0x2d52;ACK_FAILURE;LOW;PLOC receive acknowledgment failure report P1: Command Id which leads the acknowledgment failure report P2: The status field inserted by the MPSoC into the data field;linux/payload/PlocMpsocHandler.h
 | 
			
		||||
11603;0x2d53;EXE_FAILURE;LOW;PLOC receive execution failure report P1: Command Id which leads the execution failure report P2: The status field inserted by the MPSoC into the data field;linux/payload/PlocMpsocHandler.h
 | 
			
		||||
11604;0x2d54;MPSOC_HANDLER_CRC_FAILURE;LOW;PLOC reply has invalid crc;linux/payload/PlocMpsocHandler.h
 | 
			
		||||
11605;0x2d55;MPSOC_HANDLER_SEQUENCE_COUNT_MISMATCH;LOW;Packet sequence count in received space packet does not match expected count P1: Expected sequence count P2: Received sequence count;linux/payload/PlocMpsocHandler.h
 | 
			
		||||
11606;0x2d56;MPSOC_SHUTDOWN_FAILED;HIGH;Supervisor fails to shutdown MPSoC. Requires to power off the PLOC and thus also to shutdown the supervisor.;linux/payload/PlocMpsocHandler.h
 | 
			
		||||
11607;0x2d57;SUPV_NOT_ON;LOW;SUPV not on for boot or shutdown process. P1: 0 for OFF transition, 1 for ON transition.;linux/payload/PlocMpsocHandler.h
 | 
			
		||||
11608;0x2d58;SUPV_REPLY_TIMEOUT;LOW;No description;linux/payload/PlocMpsocHandler.h
 | 
			
		||||
11701;0x2db5;SELF_TEST_I2C_FAILURE;LOW;Get self test result returns I2C failure P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission/acs/ImtqHandler.h
 | 
			
		||||
11702;0x2db6;SELF_TEST_SPI_FAILURE;LOW;Get self test result returns SPI failure. This concerns the MTM connectivity. P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission/acs/ImtqHandler.h
 | 
			
		||||
11703;0x2db7;SELF_TEST_ADC_FAILURE;LOW;Get self test result returns failure in measurement of current and temperature. P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission/acs/ImtqHandler.h
 | 
			
		||||
@@ -150,16 +143,14 @@ Event ID (dec); Event ID (hex); Name; Severity; Description; File Path
 | 
			
		||||
11901;0x2e7d;BOOTING_FIRMWARE_FAILED_EVENT;LOW;Failed to boot firmware;mission/acs/str/StarTrackerHandler.h
 | 
			
		||||
11902;0x2e7e;BOOTING_BOOTLOADER_FAILED_EVENT;LOW;Failed to boot star tracker into bootloader mode;mission/acs/str/StarTrackerHandler.h
 | 
			
		||||
11903;0x2e7f;COM_ERROR_REPLY_RECEIVED;LOW;Received COM error. P1:  Communication Error ID (datasheet p32);mission/acs/str/StarTrackerHandler.h
 | 
			
		||||
12001;0x2ee1;SUPV_MEMORY_READ_RPT_CRC_FAILURE;LOW;PLOC supervisor crc failure in telemetry packet;linux/payload/plocSupvDefs.h
 | 
			
		||||
12002;0x2ee2;SUPV_UNKNOWN_TM;LOW;Unhandled event. P1: APID, P2: Service ID;linux/payload/plocSupvDefs.h
 | 
			
		||||
12003;0x2ee3;SUPV_UNINIMPLEMENTED_TM;LOW;No description;linux/payload/plocSupvDefs.h
 | 
			
		||||
12004;0x2ee4;SUPV_ACK_FAILURE;LOW;PLOC supervisor received acknowledgment failure report;linux/payload/plocSupvDefs.h
 | 
			
		||||
12005;0x2ee5;SUPV_EXE_FAILURE;LOW;PLOC received execution failure report P1: ID of command for which the execution failed P2: Status code sent by the supervisor handler;linux/payload/plocSupvDefs.h
 | 
			
		||||
12006;0x2ee6;SUPV_CRC_FAILURE_EVENT;LOW;PLOC supervisor reply has invalid crc;linux/payload/plocSupvDefs.h
 | 
			
		||||
12007;0x2ee7;SUPV_HELPER_EXECUTING;LOW;Supervisor helper currently executing a command;linux/payload/plocSupvDefs.h
 | 
			
		||||
12008;0x2ee8;SUPV_MPSOC_SHUTDOWN_BUILD_FAILED;LOW;Failed to build the command to shutdown the MPSoC;linux/payload/plocSupvDefs.h
 | 
			
		||||
12009;0x2ee9;SUPV_ACK_UNKNOWN_COMMAND;LOW;Received ACK, but no related command is unknown or has not been sent  by this software instance. P1: Module APID. P2: Service ID.;linux/payload/plocSupvDefs.h
 | 
			
		||||
12010;0x2eea;SUPV_EXE_ACK_UNKNOWN_COMMAND;LOW;Received ACK EXE, but no related command is unknown or has not been sent  by this software instance. P1: Module APID. P2: Service ID.;linux/payload/plocSupvDefs.h
 | 
			
		||||
12001;0x2ee1;SUPV_MEMORY_READ_RPT_CRC_FAILURE;LOW;PLOC supervisor crc failure in telemetry packet;linux/payload/PlocSupervisorHandler.h
 | 
			
		||||
12002;0x2ee2;SUPV_UNKNOWN_TM;LOW;Unhandled event. P1: APID, P2: Service ID;linux/payload/PlocSupervisorHandler.h
 | 
			
		||||
12003;0x2ee3;SUPV_UNINIMPLEMENTED_TM;LOW;No description;linux/payload/PlocSupervisorHandler.h
 | 
			
		||||
12004;0x2ee4;SUPV_ACK_FAILURE;LOW;PLOC supervisor received acknowledgment failure report;linux/payload/PlocSupervisorHandler.h
 | 
			
		||||
12005;0x2ee5;SUPV_EXE_FAILURE;LOW;PLOC received execution failure report P1: ID of command for which the execution failed P2: Status code sent by the supervisor handler;linux/payload/PlocSupervisorHandler.h
 | 
			
		||||
12006;0x2ee6;SUPV_CRC_FAILURE_EVENT;LOW;PLOC supervisor reply has invalid crc;linux/payload/PlocSupervisorHandler.h
 | 
			
		||||
12007;0x2ee7;SUPV_HELPER_EXECUTING;LOW;Supervisor helper currently executing a command;linux/payload/PlocSupervisorHandler.h
 | 
			
		||||
12008;0x2ee8;SUPV_MPSOC_SHUTDOWN_BUILD_FAILED;LOW;Failed to build the command to shutdown the MPSoC;linux/payload/PlocSupervisorHandler.h
 | 
			
		||||
12100;0x2f44;SANITIZATION_FAILED;LOW;No description;bsp_q7s/fs/SdCardManager.h
 | 
			
		||||
12101;0x2f45;MOUNTED_SD_CARD;INFO;No description;bsp_q7s/fs/SdCardManager.h
 | 
			
		||||
12300;0x300c;SEND_MRAM_DUMP_FAILED;LOW;Failed to send mram dump command to supervisor handler P1: Return value of commandAction function P2: Start address of MRAM to dump with this command;linux/payload/PlocMemoryDumper.h
 | 
			
		||||
@@ -237,9 +228,8 @@ Event ID (dec); Event ID (hex); Name; Severity; Description; File Path
 | 
			
		||||
12902;0x3266;POWER_STATE_MACHINE_TIMEOUT;MEDIUM;No description;mission/system/acs/SusAssembly.h
 | 
			
		||||
12903;0x3267;SIDE_SWITCH_TRANSITION_NOT_ALLOWED;LOW;Not implemented, would increase already high complexity. Operator should instead command the assembly off first and then command the assembly on into the desired mode/submode combination;mission/system/acs/SusAssembly.h
 | 
			
		||||
13000;0x32c8;CHILDREN_LOST_MODE;MEDIUM;No description;mission/system/tcs/TcsBoardAssembly.h
 | 
			
		||||
13100;0x332c;GPS_FIX_CHANGE;INFO;Fix has changed. P1: New fix. P2: Missed fix changes 0: Not seen, 1: No Fix, 2: 2D-Fix, 3: 3D-Fix;linux/acs/GPSDefinitions.h
 | 
			
		||||
13101;0x332d;CANT_GET_FIX;MEDIUM;Could not get fix in maximum allowed time. Trying to reset both GNSS devices. P1: Maximum allowed time to get a fix after the GPS was switched on.;linux/acs/GPSDefinitions.h
 | 
			
		||||
13102;0x332e;RESET_FAIL;HIGH;Failed to reset an GNNS Device. P1: Board-Side.;linux/acs/GPSDefinitions.h
 | 
			
		||||
13100;0x332c;GPS_FIX_CHANGE;INFO;Fix has changed. P1: Old fix. P2: New fix 0: Not seen, 1: No Fix, 2: 2D-Fix, 3: 3D-Fix;mission/acs/archive/GPSDefinitions.h
 | 
			
		||||
13101;0x332d;CANT_GET_FIX;LOW;Could not get fix in maximum allowed time. P1: Maximum allowed time to get a fix after the GPS was switched on.;mission/acs/archive/GPSDefinitions.h
 | 
			
		||||
13200;0x3390;P60_BOOT_COUNT;INFO;P60 boot count is broadcasted once at SW startup. P1: Boot count;mission/power/P60DockHandler.h
 | 
			
		||||
13201;0x3391;BATT_MODE;INFO;Battery mode is broadcasted at startup. P1: Mode;mission/power/P60DockHandler.h
 | 
			
		||||
13202;0x3392;BATT_MODE_CHANGED;MEDIUM;Battery mode has changed. P1: Old mode. P2: New mode;mission/power/P60DockHandler.h
 | 
			
		||||
 
 | 
			
		||||
		
		
			
  | 
@@ -57,7 +57,6 @@
 | 
			
		||||
0x44330015;PLOC_MPSOC_HANDLER
 | 
			
		||||
0x44330016;PLOC_SUPERVISOR_HANDLER
 | 
			
		||||
0x44330017;PLOC_SUPERVISOR_HELPER
 | 
			
		||||
0x44330018;PLOC_MPSOC_COMMUNICATION
 | 
			
		||||
0x44330032;SCEX
 | 
			
		||||
0x444100A2;SOLAR_ARRAY_DEPL_HANDLER
 | 
			
		||||
0x444100A4;HEATER_HANDLER
 | 
			
		||||
 
 | 
			
		||||
		
		
			
  | 
@@ -387,7 +387,6 @@ Full ID (hex); Name; Description; Unique ID; Subsytem Name; File Path
 | 
			
		||||
0x4304;PUS11_InvalidRelativeTime;No description;4;PUS_SERVICE_11;fsfw/src/fsfw/pus/Service11TelecommandScheduling.h
 | 
			
		||||
0x4305;PUS11_ContainedTcTooSmall;No description;5;PUS_SERVICE_11;fsfw/src/fsfw/pus/Service11TelecommandScheduling.h
 | 
			
		||||
0x4306;PUS11_ContainedTcCrcMissmatch;No description;6;PUS_SERVICE_11;fsfw/src/fsfw/pus/Service11TelecommandScheduling.h
 | 
			
		||||
0x4307;PUS11_MapIsFull;No description;7;PUS_SERVICE_11;fsfw/src/fsfw/pus/Service11TelecommandScheduling.h
 | 
			
		||||
0x4400;FILS_GenericFileError;No description;0;FILE_SYSTEM;fsfw/src/fsfw/filesystem/HasFileSystemIF.h
 | 
			
		||||
0x4401;FILS_GenericDirError;No description;1;FILE_SYSTEM;fsfw/src/fsfw/filesystem/HasFileSystemIF.h
 | 
			
		||||
0x4402;FILS_FilesystemInactive;No description;2;FILE_SYSTEM;fsfw/src/fsfw/filesystem/HasFileSystemIF.h
 | 
			
		||||
@@ -454,12 +453,6 @@ Full ID (hex); Name; Description; Unique ID; Subsytem Name; File Path
 | 
			
		||||
0x5208;IMTQ_CmdErrUnknown;No description;8;IMTQ_HANDLER;mission/acs/imtqHelpers.h
 | 
			
		||||
0x5209;IMTQ_StartupCfgError;No description;9;IMTQ_HANDLER;mission/acs/imtqHelpers.h
 | 
			
		||||
0x520a;IMTQ_UnexpectedSelfTestReply;The status reply to a self test command was received but no self test command has been sent. This should normally never happen.;10;IMTQ_HANDLER;mission/acs/imtqHelpers.h
 | 
			
		||||
0x53a0;RWHA_InvalidSpeed;Action Message with invalid speed was received. Valid speeds must be in the range of [-65000, 1000] or [1000, 65000];160;RW_HANDLER;mission/acs/RwHandler.h
 | 
			
		||||
0x53a1;RWHA_InvalidRampTime;Action Message with invalid ramp time was received.;161;RW_HANDLER;mission/acs/RwHandler.h
 | 
			
		||||
0x53a2;RWHA_SetSpeedCommandInvalidLength;Received set speed command has invalid length. Should be 6.;162;RW_HANDLER;mission/acs/RwHandler.h
 | 
			
		||||
0x53a3;RWHA_ExecutionFailed;Command execution failed;163;RW_HANDLER;mission/acs/RwHandler.h
 | 
			
		||||
0x53a4;RWHA_CrcError;Reaction wheel reply has invalid crc;164;RW_HANDLER;mission/acs/RwHandler.h
 | 
			
		||||
0x53a5;RWHA_ValueNotRead;No description;165;RW_HANDLER;mission/acs/RwHandler.h
 | 
			
		||||
0x53b0;RWHA_SpiWriteFailure;No description;176;RW_HANDLER;mission/acs/rwHelpers.h
 | 
			
		||||
0x53b1;RWHA_SpiReadFailure;Used by the spi send function to tell a failing read call;177;RW_HANDLER;mission/acs/rwHelpers.h
 | 
			
		||||
0x53b2;RWHA_MissingStartSign;Can be used by the HDLC decoding mechanism to inform about a missing start sign 0x7E;178;RW_HANDLER;mission/acs/rwHelpers.h
 | 
			
		||||
@@ -493,8 +486,12 @@ Full ID (hex); Name; Description; Unique ID; Subsytem Name; File Path
 | 
			
		||||
0x54b6;STRH_StartrackerAlreadyBooted;Star tracker is already in firmware mode;182;STR_HANDLER;mission/acs/str/StarTrackerHandler.h
 | 
			
		||||
0x54b7;STRH_StartrackerNotRunningFirmware;Star tracker must be in firmware mode to run this command;183;STR_HANDLER;mission/acs/str/StarTrackerHandler.h
 | 
			
		||||
0x54b8;STRH_StartrackerNotRunningBootloader;Star tracker must be in bootloader mode to run this command;184;STR_HANDLER;mission/acs/str/StarTrackerHandler.h
 | 
			
		||||
0x59a0;SUSS_ErrorUnlockMutex;No description;160;SUS_HANDLER;mission/acs/archive/LegacySusHandler.h
 | 
			
		||||
0x59a1;SUSS_ErrorLockMutex;No description;161;SUS_HANDLER;mission/acs/archive/LegacySusHandler.h
 | 
			
		||||
0x59a0;SUSS_InvalidSpeed;Action Message with invalid speed was received. Valid speeds must be in the range of [-65000, 1000] or [1000, 65000];160;SUS_HANDLER;mission/acs/RwHandler.h
 | 
			
		||||
0x59a1;SUSS_InvalidRampTime;Action Message with invalid ramp time was received.;161;SUS_HANDLER;mission/acs/RwHandler.h
 | 
			
		||||
0x59a2;SUSS_SetSpeedCommandInvalidLength;Received set speed command has invalid length. Should be 6.;162;SUS_HANDLER;mission/acs/RwHandler.h
 | 
			
		||||
0x59a3;SUSS_ExecutionFailed;Command execution failed;163;SUS_HANDLER;mission/acs/RwHandler.h
 | 
			
		||||
0x59a4;SUSS_CrcError;Reaction wheel reply has invalid crc;164;SUS_HANDLER;mission/acs/RwHandler.h
 | 
			
		||||
0x59a5;SUSS_ValueNotRead;No description;165;SUS_HANDLER;mission/acs/RwHandler.h
 | 
			
		||||
0x5e00;GOMS_PacketTooLong;No description;0;GOM_SPACE_HANDLER;mission/power/GomspaceDeviceHandler.h
 | 
			
		||||
0x5e01;GOMS_InvalidTableId;No description;1;GOM_SPACE_HANDLER;mission/power/GomspaceDeviceHandler.h
 | 
			
		||||
0x5e02;GOMS_InvalidAddress;No description;2;GOM_SPACE_HANDLER;mission/power/GomspaceDeviceHandler.h
 | 
			
		||||
@@ -511,11 +508,7 @@ Full ID (hex); Name; Description; Unique ID; Subsytem Name; File Path
 | 
			
		||||
0x67a2;SADPL_MainSwitchTimeoutFailure;No description;162;SA_DEPL_HANDLER;mission/SolarArrayDeploymentHandler.h
 | 
			
		||||
0x67a3;SADPL_SwitchingDeplSa1Failed;No description;163;SA_DEPL_HANDLER;mission/SolarArrayDeploymentHandler.h
 | 
			
		||||
0x67a4;SADPL_SwitchingDeplSa2Failed;No description;164;SA_DEPL_HANDLER;mission/SolarArrayDeploymentHandler.h
 | 
			
		||||
0x6aa0;ACSCTRL_FileDeletionFailed;File deletion failed and at least one file is still existent.;160;ACS_CTRL;mission/controller/controllerdefinitions/AcsCtrlDefinitions.h
 | 
			
		||||
0x6aa1;ACSCTRL_WriteFileFailed;Writing the TLE to the file has failed.;161;ACS_CTRL;mission/controller/controllerdefinitions/AcsCtrlDefinitions.h
 | 
			
		||||
0x6aa2;ACSCTRL_ReadFileFailed;Reading the TLE to the file has failed.;162;ACS_CTRL;mission/controller/controllerdefinitions/AcsCtrlDefinitions.h
 | 
			
		||||
0x6aa3;ACSCTRL_SingleRwUnavailable;A single RW has failed.;163;ACS_CTRL;mission/controller/controllerdefinitions/AcsCtrlDefinitions.h
 | 
			
		||||
0x6aa4;ACSCTRL_MultipleRwUnavailable;Multiple RWs have failed.;164;ACS_CTRL;mission/controller/controllerdefinitions/AcsCtrlDefinitions.h
 | 
			
		||||
0x6a00;ACSCTRL_FileDeletionFailed;File deletion failed and at least one file is still existent.;0;ACS_CTRL;mission/controller/AcsController.h
 | 
			
		||||
0x6b02;ACSMEKF_MekfUninitialized;No description;2;ACS_MEKF;mission/controller/acs/MultiplicativeKalmanFilter.h
 | 
			
		||||
0x6b03;ACSMEKF_MekfNoGyrData;No description;3;ACS_MEKF;mission/controller/acs/MultiplicativeKalmanFilter.h
 | 
			
		||||
0x6b04;ACSMEKF_MekfNoModelVectors;No description;4;ACS_MEKF;mission/controller/acs/MultiplicativeKalmanFilter.h
 | 
			
		||||
@@ -529,5 +522,4 @@ Full ID (hex); Name; Description; Unique ID; Subsytem Name; File Path
 | 
			
		||||
0x6f00;TMS_IsBusy;No description;0;TM_SINK;mission/tmtc/DirectTmSinkIF.h
 | 
			
		||||
0x6f01;TMS_PartiallyWritten;No description;1;TM_SINK;mission/tmtc/DirectTmSinkIF.h
 | 
			
		||||
0x6f02;TMS_NoWriteActive;No description;2;TM_SINK;mission/tmtc/DirectTmSinkIF.h
 | 
			
		||||
0x6f03;TMS_Timeout;No description;3;TM_SINK;mission/tmtc/DirectTmSinkIF.h
 | 
			
		||||
0x7000;VCS_ChannelDoesNotExist;No description;0;VIRTUAL_CHANNEL;mission/com/VirtualChannel.h
 | 
			
		||||
 
 | 
			
		||||
		
		
			
  | 
@@ -75,12 +75,9 @@ Event ID (dec); Event ID (hex); Name; Severity; Description; File Path
 | 
			
		||||
7902;0x1ede;BIT_LOCK;INFO;A Bit Lock signal. Was detected. P1: raw BLO state, P2: 0;fsfw/src/fsfw/datalinklayer/DataLinkLayer.h
 | 
			
		||||
7903;0x1edf;BIT_LOCK_LOST;INFO;A previously found Bit Lock signal was lost. P1: raw BLO state, P2: 0;fsfw/src/fsfw/datalinklayer/DataLinkLayer.h
 | 
			
		||||
7905;0x1ee1;FRAME_PROCESSING_FAILED;LOW;The CCSDS Board could not interpret a TC;fsfw/src/fsfw/datalinklayer/DataLinkLayer.h
 | 
			
		||||
8900;0x22c4;CLOCK_SET;INFO;Clock has been set. P1: old timeval seconds. P2: new timeval seconds.;fsfw/src/fsfw/pus/Service9TimeManagement.h
 | 
			
		||||
8901;0x22c5;CLOCK_DUMP_LEGACY;INFO;Clock dump event. P1: timeval seconds P2: timeval milliseconds.;fsfw/src/fsfw/pus/Service9TimeManagement.h
 | 
			
		||||
8902;0x22c6;CLOCK_SET_FAILURE;LOW;Clock could not be set. P1: Returncode.;fsfw/src/fsfw/pus/Service9TimeManagement.h
 | 
			
		||||
8903;0x22c7;CLOCK_DUMP;INFO;Clock dump event. P1: timeval seconds P2: timeval microseconds.;fsfw/src/fsfw/pus/Service9TimeManagement.h
 | 
			
		||||
8904;0x22c8;CLOCK_DUMP_BEFORE_SETTING_TIME;INFO;No description;fsfw/src/fsfw/pus/Service9TimeManagement.h
 | 
			
		||||
8905;0x22c9;CLOCK_DUMP_AFTER_SETTING_TIME;INFO;No description;fsfw/src/fsfw/pus/Service9TimeManagement.h
 | 
			
		||||
8900;0x22c4;CLOCK_SET;INFO;No description;fsfw/src/fsfw/pus/Service9TimeManagement.h
 | 
			
		||||
8901;0x22c5;CLOCK_DUMP;INFO;No description;fsfw/src/fsfw/pus/Service9TimeManagement.h
 | 
			
		||||
8902;0x22c6;CLOCK_SET_FAILURE;LOW;No description;fsfw/src/fsfw/pus/Service9TimeManagement.h
 | 
			
		||||
9100;0x238c;TC_DELETION_FAILED;MEDIUM;Deletion of a TC from the map failed. P1: First 32 bit of request ID, P2. Last 32 bit of Request ID;fsfw/src/fsfw/pus/Service11TelecommandScheduling.h
 | 
			
		||||
9700;0x25e4;TEST;INFO;No description;fsfw/src/fsfw/pus/Service17Test.h
 | 
			
		||||
10600;0x2968;CHANGE_OF_SETUP_PARAMETER;LOW;No description;fsfw/src/fsfw_hal/devicehandlers/MgmLIS3MDLHandler.h
 | 
			
		||||
@@ -91,17 +88,14 @@ Event ID (dec); Event ID (hex); Name; Severity; Description; File Path
 | 
			
		||||
10804;0x2a34;FILENAME_TOO_LARGE_ERROR;LOW;P1: Transaction step ID, P2: 0 for source file name, 1 for dest file name;fsfw/src/fsfw/cfdp/handler/defs.h
 | 
			
		||||
10805;0x2a35;HANDLING_CFDP_REQUEST_FAILED;LOW;CFDP request handling failed. P2: Returncode.;fsfw/src/fsfw/cfdp/handler/defs.h
 | 
			
		||||
11200;0x2bc0;SAFE_RATE_VIOLATION;MEDIUM;The limits for the rotation in safe mode were violated.;mission/acs/defs.h
 | 
			
		||||
11201;0x2bc1;RATE_RECOVERY;MEDIUM;The system has recovered from a rate rotation violation.;mission/acs/defs.h
 | 
			
		||||
11201;0x2bc1;SAFE_RATE_RECOVERY;MEDIUM;The system has recovered from a safe rate rotation violation.;mission/acs/defs.h
 | 
			
		||||
11202;0x2bc2;MULTIPLE_RW_INVALID;HIGH;Multiple RWs are invalid, uncommandable and therefore higher ACS modes cannot be maintained.;mission/acs/defs.h
 | 
			
		||||
11203;0x2bc3;MEKF_INVALID_INFO;INFO;MEKF was not able to compute a solution. P1: MEKF state on exit;mission/acs/defs.h
 | 
			
		||||
11204;0x2bc4;MEKF_RECOVERY;INFO;MEKF is able to compute a solution again.;mission/acs/defs.h
 | 
			
		||||
11205;0x2bc5;MEKF_AUTOMATIC_RESET;INFO;MEKF performed an automatic reset after detection of nonfinite values.;mission/acs/defs.h
 | 
			
		||||
11206;0x2bc6;PTG_CTRL_NO_ATTITUDE_INFORMATION;HIGH;For a prolonged time, no attitude information was available for the Pointing Controller. Falling back to Safe Mode.;mission/acs/defs.h
 | 
			
		||||
11206;0x2bc6;MEKF_INVALID_MODE_VIOLATION;HIGH;MEKF was not able to compute a solution during any pointing ACS mode for a prolonged time.;mission/acs/defs.h
 | 
			
		||||
11207;0x2bc7;SAFE_MODE_CONTROLLER_FAILURE;HIGH;The ACS safe mode controller was not able to compute a solution and has failed. P1: Missing information about magnetic field, P2: Missing information about rotational rate;mission/acs/defs.h
 | 
			
		||||
11208;0x2bc8;TLE_TOO_OLD;INFO;The TLE for the SGP4 Propagator has become too old.;mission/acs/defs.h
 | 
			
		||||
11209;0x2bc9;TLE_FILE_READ_FAILED;LOW;The TLE could not be read from the filesystem.;mission/acs/defs.h
 | 
			
		||||
11210;0x2bca;PTG_RATE_VIOLATION;MEDIUM;The limits for the rotation in pointing mode were violated.;mission/acs/defs.h
 | 
			
		||||
11211;0x2bcb;DETUMBLE_TRANSITION_FAILED;HIGH;The detumble transition has failed. //! P1: Last detumble state before failure.;mission/acs/defs.h
 | 
			
		||||
11300;0x2c24;SWITCH_CMD_SENT;INFO;Indicates that a FSFW object requested setting a switch P1: 1 if on was requested, 0 for off | P2: Switch Index;mission/power/defs.h
 | 
			
		||||
11301;0x2c25;SWITCH_HAS_CHANGED;INFO;Indicated that a switch state has changed P1: New switch state, 1 for on, 0 for off | P2: Switch Index;mission/power/defs.h
 | 
			
		||||
11302;0x2c26;SWITCHING_Q7S_DENIED;MEDIUM;No description;mission/power/defs.h
 | 
			
		||||
@@ -128,15 +122,14 @@ Event ID (dec); Event ID (hex); Name; Severity; Description; File Path
 | 
			
		||||
11506;0x2cf2;DEPL_SA1_GPIO_SWTICH_OFF_FAILED;HIGH;No description;mission/SolarArrayDeploymentHandler.h
 | 
			
		||||
11507;0x2cf3;DEPL_SA2_GPIO_SWTICH_OFF_FAILED;HIGH;No description;mission/SolarArrayDeploymentHandler.h
 | 
			
		||||
11508;0x2cf4;AUTONOMOUS_DEPLOYMENT_COMPLETED;INFO;No description;mission/SolarArrayDeploymentHandler.h
 | 
			
		||||
11601;0x2d51;MEMORY_READ_RPT_CRC_FAILURE;LOW;PLOC crc failure in telemetry packet;linux/payload/plocMpsocHelpers.h
 | 
			
		||||
11602;0x2d52;ACK_FAILURE;LOW;PLOC receive acknowledgment failure report P1: Command Id which leads the acknowledgment failure report P2: The status field inserted by the MPSoC into the data field;linux/payload/plocMpsocHelpers.h
 | 
			
		||||
11603;0x2d53;EXE_FAILURE;LOW;PLOC receive execution failure report P1: Command Id which leads the execution failure report P2: The status field inserted by the MPSoC into the data field;linux/payload/plocMpsocHelpers.h
 | 
			
		||||
11604;0x2d54;MPSOC_HANDLER_CRC_FAILURE;LOW;PLOC reply has invalid crc;linux/payload/plocMpsocHelpers.h
 | 
			
		||||
11605;0x2d55;MPSOC_HANDLER_SEQUENCE_COUNT_MISMATCH;LOW;Packet sequence count in received space packet does not match expected count P1: Expected sequence count P2: Received sequence count;linux/payload/plocMpsocHelpers.h
 | 
			
		||||
11606;0x2d56;MPSOC_SHUTDOWN_FAILED;HIGH;Supervisor fails to shutdown MPSoC. Requires to power off the PLOC and thus also to shutdown the supervisor.;linux/payload/plocMpsocHelpers.h
 | 
			
		||||
11607;0x2d57;SUPV_NOT_ON;LOW;SUPV not on for boot or shutdown process. P1: 0 for OFF transition, 1 for ON transition.;linux/payload/plocMpsocHelpers.h
 | 
			
		||||
11608;0x2d58;SUPV_REPLY_TIMEOUT;LOW;SUPV reply timeout.;linux/payload/plocMpsocHelpers.h
 | 
			
		||||
11609;0x2d59;CAM_MUST_BE_ON_FOR_SNAPSHOT_MODE;LOW;Camera must be commanded on first.;linux/payload/plocMpsocHelpers.h
 | 
			
		||||
11601;0x2d51;MEMORY_READ_RPT_CRC_FAILURE;LOW;PLOC crc failure in telemetry packet;linux/payload/PlocMpsocHandler.h
 | 
			
		||||
11602;0x2d52;ACK_FAILURE;LOW;PLOC receive acknowledgment failure report P1: Command Id which leads the acknowledgment failure report P2: The status field inserted by the MPSoC into the data field;linux/payload/PlocMpsocHandler.h
 | 
			
		||||
11603;0x2d53;EXE_FAILURE;LOW;PLOC receive execution failure report P1: Command Id which leads the execution failure report P2: The status field inserted by the MPSoC into the data field;linux/payload/PlocMpsocHandler.h
 | 
			
		||||
11604;0x2d54;MPSOC_HANDLER_CRC_FAILURE;LOW;PLOC reply has invalid crc;linux/payload/PlocMpsocHandler.h
 | 
			
		||||
11605;0x2d55;MPSOC_HANDLER_SEQUENCE_COUNT_MISMATCH;LOW;Packet sequence count in received space packet does not match expected count P1: Expected sequence count P2: Received sequence count;linux/payload/PlocMpsocHandler.h
 | 
			
		||||
11606;0x2d56;MPSOC_SHUTDOWN_FAILED;HIGH;Supervisor fails to shutdown MPSoC. Requires to power off the PLOC and thus also to shutdown the supervisor.;linux/payload/PlocMpsocHandler.h
 | 
			
		||||
11607;0x2d57;SUPV_NOT_ON;LOW;SUPV not on for boot or shutdown process. P1: 0 for OFF transition, 1 for ON transition.;linux/payload/PlocMpsocHandler.h
 | 
			
		||||
11608;0x2d58;SUPV_REPLY_TIMEOUT;LOW;No description;linux/payload/PlocMpsocHandler.h
 | 
			
		||||
11701;0x2db5;SELF_TEST_I2C_FAILURE;LOW;Get self test result returns I2C failure P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission/acs/ImtqHandler.h
 | 
			
		||||
11702;0x2db6;SELF_TEST_SPI_FAILURE;LOW;Get self test result returns SPI failure. This concerns the MTM connectivity. P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission/acs/ImtqHandler.h
 | 
			
		||||
11703;0x2db7;SELF_TEST_ADC_FAILURE;LOW;Get self test result returns failure in measurement of current and temperature. P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission/acs/ImtqHandler.h
 | 
			
		||||
@@ -150,16 +143,14 @@ Event ID (dec); Event ID (hex); Name; Severity; Description; File Path
 | 
			
		||||
11901;0x2e7d;BOOTING_FIRMWARE_FAILED_EVENT;LOW;Failed to boot firmware;mission/acs/str/StarTrackerHandler.h
 | 
			
		||||
11902;0x2e7e;BOOTING_BOOTLOADER_FAILED_EVENT;LOW;Failed to boot star tracker into bootloader mode;mission/acs/str/StarTrackerHandler.h
 | 
			
		||||
11903;0x2e7f;COM_ERROR_REPLY_RECEIVED;LOW;Received COM error. P1:  Communication Error ID (datasheet p32);mission/acs/str/StarTrackerHandler.h
 | 
			
		||||
12001;0x2ee1;SUPV_MEMORY_READ_RPT_CRC_FAILURE;LOW;PLOC supervisor crc failure in telemetry packet;linux/payload/plocSupvDefs.h
 | 
			
		||||
12002;0x2ee2;SUPV_UNKNOWN_TM;LOW;Unhandled event. P1: APID, P2: Service ID;linux/payload/plocSupvDefs.h
 | 
			
		||||
12003;0x2ee3;SUPV_UNINIMPLEMENTED_TM;LOW;No description;linux/payload/plocSupvDefs.h
 | 
			
		||||
12004;0x2ee4;SUPV_ACK_FAILURE;LOW;PLOC supervisor received acknowledgment failure report;linux/payload/plocSupvDefs.h
 | 
			
		||||
12005;0x2ee5;SUPV_EXE_FAILURE;LOW;PLOC received execution failure report P1: ID of command for which the execution failed P2: Status code sent by the supervisor handler;linux/payload/plocSupvDefs.h
 | 
			
		||||
12006;0x2ee6;SUPV_CRC_FAILURE_EVENT;LOW;PLOC supervisor reply has invalid crc;linux/payload/plocSupvDefs.h
 | 
			
		||||
12007;0x2ee7;SUPV_HELPER_EXECUTING;LOW;Supervisor helper currently executing a command;linux/payload/plocSupvDefs.h
 | 
			
		||||
12008;0x2ee8;SUPV_MPSOC_SHUTDOWN_BUILD_FAILED;LOW;Failed to build the command to shutdown the MPSoC;linux/payload/plocSupvDefs.h
 | 
			
		||||
12009;0x2ee9;SUPV_ACK_UNKNOWN_COMMAND;LOW;Received ACK, but no related command is unknown or has not been sent  by this software instance. P1: Module APID. P2: Service ID.;linux/payload/plocSupvDefs.h
 | 
			
		||||
12010;0x2eea;SUPV_EXE_ACK_UNKNOWN_COMMAND;LOW;Received ACK EXE, but no related command is unknown or has not been sent  by this software instance. P1: Module APID. P2: Service ID.;linux/payload/plocSupvDefs.h
 | 
			
		||||
12001;0x2ee1;SUPV_MEMORY_READ_RPT_CRC_FAILURE;LOW;PLOC supervisor crc failure in telemetry packet;linux/payload/PlocSupervisorHandler.h
 | 
			
		||||
12002;0x2ee2;SUPV_UNKNOWN_TM;LOW;Unhandled event. P1: APID, P2: Service ID;linux/payload/PlocSupervisorHandler.h
 | 
			
		||||
12003;0x2ee3;SUPV_UNINIMPLEMENTED_TM;LOW;No description;linux/payload/PlocSupervisorHandler.h
 | 
			
		||||
12004;0x2ee4;SUPV_ACK_FAILURE;LOW;PLOC supervisor received acknowledgment failure report;linux/payload/PlocSupervisorHandler.h
 | 
			
		||||
12005;0x2ee5;SUPV_EXE_FAILURE;LOW;PLOC received execution failure report P1: ID of command for which the execution failed P2: Status code sent by the supervisor handler;linux/payload/PlocSupervisorHandler.h
 | 
			
		||||
12006;0x2ee6;SUPV_CRC_FAILURE_EVENT;LOW;PLOC supervisor reply has invalid crc;linux/payload/PlocSupervisorHandler.h
 | 
			
		||||
12007;0x2ee7;SUPV_HELPER_EXECUTING;LOW;Supervisor helper currently executing a command;linux/payload/PlocSupervisorHandler.h
 | 
			
		||||
12008;0x2ee8;SUPV_MPSOC_SHUTDOWN_BUILD_FAILED;LOW;Failed to build the command to shutdown the MPSoC;linux/payload/PlocSupervisorHandler.h
 | 
			
		||||
12100;0x2f44;SANITIZATION_FAILED;LOW;No description;bsp_q7s/fs/SdCardManager.h
 | 
			
		||||
12101;0x2f45;MOUNTED_SD_CARD;INFO;No description;bsp_q7s/fs/SdCardManager.h
 | 
			
		||||
12300;0x300c;SEND_MRAM_DUMP_FAILED;LOW;Failed to send mram dump command to supervisor handler P1: Return value of commandAction function P2: Start address of MRAM to dump with this command;linux/payload/PlocMemoryDumper.h
 | 
			
		||||
@@ -237,9 +228,8 @@ Event ID (dec); Event ID (hex); Name; Severity; Description; File Path
 | 
			
		||||
12902;0x3266;POWER_STATE_MACHINE_TIMEOUT;MEDIUM;No description;mission/system/acs/SusAssembly.h
 | 
			
		||||
12903;0x3267;SIDE_SWITCH_TRANSITION_NOT_ALLOWED;LOW;Not implemented, would increase already high complexity. Operator should instead command the assembly off first and then command the assembly on into the desired mode/submode combination;mission/system/acs/SusAssembly.h
 | 
			
		||||
13000;0x32c8;CHILDREN_LOST_MODE;MEDIUM;No description;mission/system/tcs/TcsBoardAssembly.h
 | 
			
		||||
13100;0x332c;GPS_FIX_CHANGE;INFO;Fix has changed. P1: New fix. P2: Missed fix changes 0: Not seen, 1: No Fix, 2: 2D-Fix, 3: 3D-Fix;linux/acs/GPSDefinitions.h
 | 
			
		||||
13101;0x332d;CANT_GET_FIX;MEDIUM;Could not get fix in maximum allowed time. Trying to reset both GNSS devices. P1: Maximum allowed time to get a fix after the GPS was switched on.;linux/acs/GPSDefinitions.h
 | 
			
		||||
13102;0x332e;RESET_FAIL;HIGH;Failed to reset an GNNS Device. P1: Board-Side.;linux/acs/GPSDefinitions.h
 | 
			
		||||
13100;0x332c;GPS_FIX_CHANGE;INFO;Fix has changed. P1: Old fix. P2: New fix 0: Not seen, 1: No Fix, 2: 2D-Fix, 3: 3D-Fix;mission/acs/archive/GPSDefinitions.h
 | 
			
		||||
13101;0x332d;CANT_GET_FIX;LOW;Could not get fix in maximum allowed time. P1: Maximum allowed time to get a fix after the GPS was switched on.;mission/acs/archive/GPSDefinitions.h
 | 
			
		||||
13200;0x3390;P60_BOOT_COUNT;INFO;P60 boot count is broadcasted once at SW startup. P1: Boot count;mission/power/P60DockHandler.h
 | 
			
		||||
13201;0x3391;BATT_MODE;INFO;Battery mode is broadcasted at startup. P1: Mode;mission/power/P60DockHandler.h
 | 
			
		||||
13202;0x3392;BATT_MODE_CHANGED;MEDIUM;Battery mode has changed. P1: Old mode. P2: New mode;mission/power/P60DockHandler.h
 | 
			
		||||
 
 | 
			
		||||
		
		
			
  | 
@@ -56,7 +56,6 @@
 | 
			
		||||
0x44330015;PLOC_MPSOC_HANDLER
 | 
			
		||||
0x44330016;PLOC_SUPERVISOR_HANDLER
 | 
			
		||||
0x44330017;PLOC_SUPERVISOR_HELPER
 | 
			
		||||
0x44330018;PLOC_MPSOC_COMMUNICATION
 | 
			
		||||
0x44330032;SCEX
 | 
			
		||||
0x444100A2;SOLAR_ARRAY_DEPL_HANDLER
 | 
			
		||||
0x444100A4;HEATER_HANDLER
 | 
			
		||||
 
 | 
			
		||||
		
		
			
  | 
@@ -387,7 +387,6 @@ Full ID (hex); Name; Description; Unique ID; Subsytem Name; File Path
 | 
			
		||||
0x4304;PUS11_InvalidRelativeTime;No description;4;PUS_SERVICE_11;fsfw/src/fsfw/pus/Service11TelecommandScheduling.h
 | 
			
		||||
0x4305;PUS11_ContainedTcTooSmall;No description;5;PUS_SERVICE_11;fsfw/src/fsfw/pus/Service11TelecommandScheduling.h
 | 
			
		||||
0x4306;PUS11_ContainedTcCrcMissmatch;No description;6;PUS_SERVICE_11;fsfw/src/fsfw/pus/Service11TelecommandScheduling.h
 | 
			
		||||
0x4307;PUS11_MapIsFull;No description;7;PUS_SERVICE_11;fsfw/src/fsfw/pus/Service11TelecommandScheduling.h
 | 
			
		||||
0x4400;FILS_GenericFileError;No description;0;FILE_SYSTEM;fsfw/src/fsfw/filesystem/HasFileSystemIF.h
 | 
			
		||||
0x4401;FILS_GenericDirError;No description;1;FILE_SYSTEM;fsfw/src/fsfw/filesystem/HasFileSystemIF.h
 | 
			
		||||
0x4402;FILS_FilesystemInactive;No description;2;FILE_SYSTEM;fsfw/src/fsfw/filesystem/HasFileSystemIF.h
 | 
			
		||||
@@ -454,12 +453,6 @@ Full ID (hex); Name; Description; Unique ID; Subsytem Name; File Path
 | 
			
		||||
0x5208;IMTQ_CmdErrUnknown;No description;8;IMTQ_HANDLER;mission/acs/imtqHelpers.h
 | 
			
		||||
0x5209;IMTQ_StartupCfgError;No description;9;IMTQ_HANDLER;mission/acs/imtqHelpers.h
 | 
			
		||||
0x520a;IMTQ_UnexpectedSelfTestReply;The status reply to a self test command was received but no self test command has been sent. This should normally never happen.;10;IMTQ_HANDLER;mission/acs/imtqHelpers.h
 | 
			
		||||
0x53a0;RWHA_InvalidSpeed;Action Message with invalid speed was received. Valid speeds must be in the range of [-65000, 1000] or [1000, 65000];160;RW_HANDLER;mission/acs/RwHandler.h
 | 
			
		||||
0x53a1;RWHA_InvalidRampTime;Action Message with invalid ramp time was received.;161;RW_HANDLER;mission/acs/RwHandler.h
 | 
			
		||||
0x53a2;RWHA_SetSpeedCommandInvalidLength;Received set speed command has invalid length. Should be 6.;162;RW_HANDLER;mission/acs/RwHandler.h
 | 
			
		||||
0x53a3;RWHA_ExecutionFailed;Command execution failed;163;RW_HANDLER;mission/acs/RwHandler.h
 | 
			
		||||
0x53a4;RWHA_CrcError;Reaction wheel reply has invalid crc;164;RW_HANDLER;mission/acs/RwHandler.h
 | 
			
		||||
0x53a5;RWHA_ValueNotRead;No description;165;RW_HANDLER;mission/acs/RwHandler.h
 | 
			
		||||
0x53b0;RWHA_SpiWriteFailure;No description;176;RW_HANDLER;mission/acs/rwHelpers.h
 | 
			
		||||
0x53b1;RWHA_SpiReadFailure;Used by the spi send function to tell a failing read call;177;RW_HANDLER;mission/acs/rwHelpers.h
 | 
			
		||||
0x53b2;RWHA_MissingStartSign;Can be used by the HDLC decoding mechanism to inform about a missing start sign 0x7E;178;RW_HANDLER;mission/acs/rwHelpers.h
 | 
			
		||||
@@ -505,8 +498,12 @@ Full ID (hex); Name; Description; Unique ID; Subsytem Name; File Path
 | 
			
		||||
0x58a1;PLSPVhLP_ProcessTerminated;Process has been terminated by command;161;PLOC_SUPV_HELPER;linux/payload/PlocSupvUartMan.h
 | 
			
		||||
0x58a2;PLSPVhLP_PathNotExists;Received command with invalid pathname;162;PLOC_SUPV_HELPER;linux/payload/PlocSupvUartMan.h
 | 
			
		||||
0x58a3;PLSPVhLP_EventBufferReplyInvalidApid;Expected event buffer TM but received space packet with other APID;163;PLOC_SUPV_HELPER;linux/payload/PlocSupvUartMan.h
 | 
			
		||||
0x59a0;SUSS_ErrorUnlockMutex;No description;160;SUS_HANDLER;mission/acs/archive/LegacySusHandler.h
 | 
			
		||||
0x59a1;SUSS_ErrorLockMutex;No description;161;SUS_HANDLER;mission/acs/archive/LegacySusHandler.h
 | 
			
		||||
0x59a0;SUSS_InvalidSpeed;Action Message with invalid speed was received. Valid speeds must be in the range of [-65000, 1000] or [1000, 65000];160;SUS_HANDLER;mission/acs/RwHandler.h
 | 
			
		||||
0x59a1;SUSS_InvalidRampTime;Action Message with invalid ramp time was received.;161;SUS_HANDLER;mission/acs/RwHandler.h
 | 
			
		||||
0x59a2;SUSS_SetSpeedCommandInvalidLength;Received set speed command has invalid length. Should be 6.;162;SUS_HANDLER;mission/acs/RwHandler.h
 | 
			
		||||
0x59a3;SUSS_ExecutionFailed;Command execution failed;163;SUS_HANDLER;mission/acs/RwHandler.h
 | 
			
		||||
0x59a4;SUSS_CrcError;Reaction wheel reply has invalid crc;164;SUS_HANDLER;mission/acs/RwHandler.h
 | 
			
		||||
0x59a5;SUSS_ValueNotRead;No description;165;SUS_HANDLER;mission/acs/RwHandler.h
 | 
			
		||||
0x5aa0;IPCI_PapbBusy;No description;160;CCSDS_IP_CORE_BRIDGE;linux/ipcore/PapbVcInterface.h
 | 
			
		||||
0x5ba0;PTME_UnknownVcId;No description;160;PTME;linux/ipcore/Ptme.h
 | 
			
		||||
0x5d01;STRHLP_SdNotMounted;SD card specified in path string not mounted;1;STR_HELPER;linux/acs/StrComHandler.h
 | 
			
		||||
@@ -561,17 +558,16 @@ Full ID (hex); Name; Description; Unique ID; Subsytem Name; File Path
 | 
			
		||||
0x67a2;SADPL_MainSwitchTimeoutFailure;No description;162;SA_DEPL_HANDLER;mission/SolarArrayDeploymentHandler.h
 | 
			
		||||
0x67a3;SADPL_SwitchingDeplSa1Failed;No description;163;SA_DEPL_HANDLER;mission/SolarArrayDeploymentHandler.h
 | 
			
		||||
0x67a4;SADPL_SwitchingDeplSa2Failed;No description;164;SA_DEPL_HANDLER;mission/SolarArrayDeploymentHandler.h
 | 
			
		||||
0x6810;MPSOCRTVIF_CommandTimeout;Command has timed out.;16;MPSOC_RETURN_VALUES_IF;linux/payload/plocMpsocHelpers.h
 | 
			
		||||
0x68a0;MPSOCRTVIF_CrcFailure;Space Packet received from PLOC has invalid CRC;160;MPSOC_RETURN_VALUES_IF;linux/payload/plocMpsocHelpers.h
 | 
			
		||||
0x68a1;MPSOCRTVIF_ReceivedAckFailure;Received ACK failure reply from PLOC;161;MPSOC_RETURN_VALUES_IF;linux/payload/plocMpsocHelpers.h
 | 
			
		||||
0x68a2;MPSOCRTVIF_ReceivedExeFailure;Received execution failure reply from PLOC;162;MPSOC_RETURN_VALUES_IF;linux/payload/plocMpsocHelpers.h
 | 
			
		||||
0x68a3;MPSOCRTVIF_InvalidApid;Received space packet with invalid APID from PLOC;163;MPSOC_RETURN_VALUES_IF;linux/payload/plocMpsocHelpers.h
 | 
			
		||||
0x68a4;MPSOCRTVIF_InvalidLength;Received command with invalid length;164;MPSOC_RETURN_VALUES_IF;linux/payload/plocMpsocHelpers.h
 | 
			
		||||
0x68a5;MPSOCRTVIF_FilenameTooLong;Filename of file in OBC filesystem is too long;165;MPSOC_RETURN_VALUES_IF;linux/payload/plocMpsocHelpers.h
 | 
			
		||||
0x68a6;MPSOCRTVIF_MpsocHelperExecuting;MPSoC helper is currently executing a command;166;MPSOC_RETURN_VALUES_IF;linux/payload/plocMpsocHelpers.h
 | 
			
		||||
0x68a7;MPSOCRTVIF_MpsocFilenameTooLong;Filename of MPSoC file is to long (max. 256 bytes);167;MPSOC_RETURN_VALUES_IF;linux/payload/plocMpsocHelpers.h
 | 
			
		||||
0x68a8;MPSOCRTVIF_InvalidParameter;Command has invalid parameter;168;MPSOC_RETURN_VALUES_IF;linux/payload/plocMpsocHelpers.h
 | 
			
		||||
0x68a9;MPSOCRTVIF_NameTooLong;Received command has file string with invalid length;169;MPSOC_RETURN_VALUES_IF;linux/payload/plocMpsocHelpers.h
 | 
			
		||||
0x68a0;MPSOCRTVIF_CrcFailure;Space Packet received from PLOC has invalid CRC;160;MPSOC_RETURN_VALUES_IF;linux/payload/mpsocRetvals.h
 | 
			
		||||
0x68a1;MPSOCRTVIF_ReceivedAckFailure;Received ACK failure reply from PLOC;161;MPSOC_RETURN_VALUES_IF;linux/payload/mpsocRetvals.h
 | 
			
		||||
0x68a2;MPSOCRTVIF_ReceivedExeFailure;Received execution failure reply from PLOC;162;MPSOC_RETURN_VALUES_IF;linux/payload/mpsocRetvals.h
 | 
			
		||||
0x68a3;MPSOCRTVIF_InvalidApid;Received space packet with invalid APID from PLOC;163;MPSOC_RETURN_VALUES_IF;linux/payload/mpsocRetvals.h
 | 
			
		||||
0x68a4;MPSOCRTVIF_InvalidLength;Received command with invalid length;164;MPSOC_RETURN_VALUES_IF;linux/payload/mpsocRetvals.h
 | 
			
		||||
0x68a5;MPSOCRTVIF_FilenameTooLong;Filename of file in OBC filesystem is too long;165;MPSOC_RETURN_VALUES_IF;linux/payload/mpsocRetvals.h
 | 
			
		||||
0x68a6;MPSOCRTVIF_MpsocHelperExecuting;MPSoC helper is currently executing a command;166;MPSOC_RETURN_VALUES_IF;linux/payload/mpsocRetvals.h
 | 
			
		||||
0x68a7;MPSOCRTVIF_MpsocFilenameTooLong;Filename of MPSoC file is to long (max. 256 bytes);167;MPSOC_RETURN_VALUES_IF;linux/payload/mpsocRetvals.h
 | 
			
		||||
0x68a8;MPSOCRTVIF_InvalidParameter;Command has invalid parameter;168;MPSOC_RETURN_VALUES_IF;linux/payload/mpsocRetvals.h
 | 
			
		||||
0x68a9;MPSOCRTVIF_NameTooLong;Received command has file string with invalid length;169;MPSOC_RETURN_VALUES_IF;linux/payload/mpsocRetvals.h
 | 
			
		||||
0x69a0;SPVRTVIF_CrcFailure;Space Packet received from PLOC supervisor has invalid CRC;160;SUPV_RETURN_VALUES_IF;linux/payload/plocSupvDefs.h
 | 
			
		||||
0x69a1;SPVRTVIF_InvalidServiceId;No description;161;SUPV_RETURN_VALUES_IF;linux/payload/plocSupvDefs.h
 | 
			
		||||
0x69a2;SPVRTVIF_ReceivedAckFailure;Received ACK failure reply from PLOC supervisor;162;SUPV_RETURN_VALUES_IF;linux/payload/plocSupvDefs.h
 | 
			
		||||
@@ -596,11 +592,7 @@ Full ID (hex); Name; Description; Unique ID; Subsytem Name; File Path
 | 
			
		||||
0x69b5;SPVRTVIF_SupvHelperExecuting;Supervisor helper task ist currently executing a command (wait until helper tas has finished or interrupt by sending the terminate command);181;SUPV_RETURN_VALUES_IF;linux/payload/plocSupvDefs.h
 | 
			
		||||
0x69c0;SPVRTVIF_BufTooSmall;No description;192;SUPV_RETURN_VALUES_IF;linux/payload/plocSupvDefs.h
 | 
			
		||||
0x69c1;SPVRTVIF_NoReplyTimeout;No description;193;SUPV_RETURN_VALUES_IF;linux/payload/plocSupvDefs.h
 | 
			
		||||
0x6aa0;ACSCTRL_FileDeletionFailed;File deletion failed and at least one file is still existent.;160;ACS_CTRL;mission/controller/controllerdefinitions/AcsCtrlDefinitions.h
 | 
			
		||||
0x6aa1;ACSCTRL_WriteFileFailed;Writing the TLE to the file has failed.;161;ACS_CTRL;mission/controller/controllerdefinitions/AcsCtrlDefinitions.h
 | 
			
		||||
0x6aa2;ACSCTRL_ReadFileFailed;Reading the TLE to the file has failed.;162;ACS_CTRL;mission/controller/controllerdefinitions/AcsCtrlDefinitions.h
 | 
			
		||||
0x6aa3;ACSCTRL_SingleRwUnavailable;A single RW has failed.;163;ACS_CTRL;mission/controller/controllerdefinitions/AcsCtrlDefinitions.h
 | 
			
		||||
0x6aa4;ACSCTRL_MultipleRwUnavailable;Multiple RWs have failed.;164;ACS_CTRL;mission/controller/controllerdefinitions/AcsCtrlDefinitions.h
 | 
			
		||||
0x6a00;ACSCTRL_FileDeletionFailed;File deletion failed and at least one file is still existent.;0;ACS_CTRL;mission/controller/AcsController.h
 | 
			
		||||
0x6b02;ACSMEKF_MekfUninitialized;No description;2;ACS_MEKF;mission/controller/acs/MultiplicativeKalmanFilter.h
 | 
			
		||||
0x6b03;ACSMEKF_MekfNoGyrData;No description;3;ACS_MEKF;mission/controller/acs/MultiplicativeKalmanFilter.h
 | 
			
		||||
0x6b04;ACSMEKF_MekfNoModelVectors;No description;4;ACS_MEKF;mission/controller/acs/MultiplicativeKalmanFilter.h
 | 
			
		||||
@@ -625,9 +617,5 @@ Full ID (hex); Name; Description; Unique ID; Subsytem Name; File Path
 | 
			
		||||
0x6f00;TMS_IsBusy;No description;0;TM_SINK;mission/tmtc/DirectTmSinkIF.h
 | 
			
		||||
0x6f01;TMS_PartiallyWritten;No description;1;TM_SINK;mission/tmtc/DirectTmSinkIF.h
 | 
			
		||||
0x6f02;TMS_NoWriteActive;No description;2;TM_SINK;mission/tmtc/DirectTmSinkIF.h
 | 
			
		||||
0x6f03;TMS_Timeout;No description;3;TM_SINK;mission/tmtc/DirectTmSinkIF.h
 | 
			
		||||
0x7000;VCS_ChannelDoesNotExist;No description;0;VIRTUAL_CHANNEL;mission/com/VirtualChannel.h
 | 
			
		||||
0x7100;PLMPCOM_PacketReceived;No description;0;PLOC_MPSOC_COM;linux/payload/MpsocCommunication.h
 | 
			
		||||
0x7101;PLMPCOM_FaultyPacketSize;No description;1;PLOC_MPSOC_COM;linux/payload/MpsocCommunication.h
 | 
			
		||||
0x7102;PLMPCOM_CrcCheckFailed;No description;2;PLOC_MPSOC_COM;linux/payload/MpsocCommunication.h
 | 
			
		||||
0x7300;SCBU_KeyNotFound;No description;0;SCRATCH_BUFFER;bsp_q7s/memory/scratchApi.h
 | 
			
		||||
0x7200;SCBU_KeyNotFound;No description;0;SCRATCH_BUFFER;bsp_q7s/memory/scratchApi.h
 | 
			
		||||
 
 | 
			
		||||
		
		
			
  | 
@@ -1,7 +1,7 @@
 | 
			
		||||
/**
 | 
			
		||||
 * @brief    Auto-generated event translation file. Contains 325 translations.
 | 
			
		||||
 * @brief    Auto-generated event translation file. Contains 315 translations.
 | 
			
		||||
 * @details
 | 
			
		||||
 * Generated on: 2024-05-06 13:47:38
 | 
			
		||||
 * Generated on: 2023-10-27 14:24:05
 | 
			
		||||
 */
 | 
			
		||||
#include "translateEvents.h"
 | 
			
		||||
 | 
			
		||||
@@ -82,11 +82,8 @@ const char *BIT_LOCK_STRING = "BIT_LOCK";
 | 
			
		||||
const char *BIT_LOCK_LOST_STRING = "BIT_LOCK_LOST";
 | 
			
		||||
const char *FRAME_PROCESSING_FAILED_STRING = "FRAME_PROCESSING_FAILED";
 | 
			
		||||
const char *CLOCK_SET_STRING = "CLOCK_SET";
 | 
			
		||||
const char *CLOCK_DUMP_LEGACY_STRING = "CLOCK_DUMP_LEGACY";
 | 
			
		||||
const char *CLOCK_SET_FAILURE_STRING = "CLOCK_SET_FAILURE";
 | 
			
		||||
const char *CLOCK_DUMP_STRING = "CLOCK_DUMP";
 | 
			
		||||
const char *CLOCK_DUMP_BEFORE_SETTING_TIME_STRING = "CLOCK_DUMP_BEFORE_SETTING_TIME";
 | 
			
		||||
const char *CLOCK_DUMP_AFTER_SETTING_TIME_STRING = "CLOCK_DUMP_AFTER_SETTING_TIME";
 | 
			
		||||
const char *CLOCK_SET_FAILURE_STRING = "CLOCK_SET_FAILURE";
 | 
			
		||||
const char *TC_DELETION_FAILED_STRING = "TC_DELETION_FAILED";
 | 
			
		||||
const char *TEST_STRING = "TEST";
 | 
			
		||||
const char *CHANGE_OF_SETUP_PARAMETER_STRING = "CHANGE_OF_SETUP_PARAMETER";
 | 
			
		||||
@@ -97,17 +94,14 @@ const char *FILESTORE_ERROR_STRING = "FILESTORE_ERROR";
 | 
			
		||||
const char *FILENAME_TOO_LARGE_ERROR_STRING = "FILENAME_TOO_LARGE_ERROR";
 | 
			
		||||
const char *HANDLING_CFDP_REQUEST_FAILED_STRING = "HANDLING_CFDP_REQUEST_FAILED";
 | 
			
		||||
const char *SAFE_RATE_VIOLATION_STRING = "SAFE_RATE_VIOLATION";
 | 
			
		||||
const char *RATE_RECOVERY_STRING = "RATE_RECOVERY";
 | 
			
		||||
const char *SAFE_RATE_RECOVERY_STRING = "SAFE_RATE_RECOVERY";
 | 
			
		||||
const char *MULTIPLE_RW_INVALID_STRING = "MULTIPLE_RW_INVALID";
 | 
			
		||||
const char *MEKF_INVALID_INFO_STRING = "MEKF_INVALID_INFO";
 | 
			
		||||
const char *MEKF_RECOVERY_STRING = "MEKF_RECOVERY";
 | 
			
		||||
const char *MEKF_AUTOMATIC_RESET_STRING = "MEKF_AUTOMATIC_RESET";
 | 
			
		||||
const char *PTG_CTRL_NO_ATTITUDE_INFORMATION_STRING = "PTG_CTRL_NO_ATTITUDE_INFORMATION";
 | 
			
		||||
const char *MEKF_INVALID_MODE_VIOLATION_STRING = "MEKF_INVALID_MODE_VIOLATION";
 | 
			
		||||
const char *SAFE_MODE_CONTROLLER_FAILURE_STRING = "SAFE_MODE_CONTROLLER_FAILURE";
 | 
			
		||||
const char *TLE_TOO_OLD_STRING = "TLE_TOO_OLD";
 | 
			
		||||
const char *TLE_FILE_READ_FAILED_STRING = "TLE_FILE_READ_FAILED";
 | 
			
		||||
const char *PTG_RATE_VIOLATION_STRING = "PTG_RATE_VIOLATION";
 | 
			
		||||
const char *DETUMBLE_TRANSITION_FAILED_STRING = "DETUMBLE_TRANSITION_FAILED";
 | 
			
		||||
const char *SWITCH_CMD_SENT_STRING = "SWITCH_CMD_SENT";
 | 
			
		||||
const char *SWITCH_HAS_CHANGED_STRING = "SWITCH_HAS_CHANGED";
 | 
			
		||||
const char *SWITCHING_Q7S_DENIED_STRING = "SWITCHING_Q7S_DENIED";
 | 
			
		||||
@@ -142,7 +136,6 @@ const char *MPSOC_HANDLER_SEQUENCE_COUNT_MISMATCH_STRING = "MPSOC_HANDLER_SEQUEN
 | 
			
		||||
const char *MPSOC_SHUTDOWN_FAILED_STRING = "MPSOC_SHUTDOWN_FAILED";
 | 
			
		||||
const char *SUPV_NOT_ON_STRING = "SUPV_NOT_ON";
 | 
			
		||||
const char *SUPV_REPLY_TIMEOUT_STRING = "SUPV_REPLY_TIMEOUT";
 | 
			
		||||
const char *CAM_MUST_BE_ON_FOR_SNAPSHOT_MODE_STRING = "CAM_MUST_BE_ON_FOR_SNAPSHOT_MODE";
 | 
			
		||||
const char *SELF_TEST_I2C_FAILURE_STRING = "SELF_TEST_I2C_FAILURE";
 | 
			
		||||
const char *SELF_TEST_SPI_FAILURE_STRING = "SELF_TEST_SPI_FAILURE";
 | 
			
		||||
const char *SELF_TEST_ADC_FAILURE_STRING = "SELF_TEST_ADC_FAILURE";
 | 
			
		||||
@@ -164,8 +157,6 @@ const char *SUPV_EXE_FAILURE_STRING = "SUPV_EXE_FAILURE";
 | 
			
		||||
const char *SUPV_CRC_FAILURE_EVENT_STRING = "SUPV_CRC_FAILURE_EVENT";
 | 
			
		||||
const char *SUPV_HELPER_EXECUTING_STRING = "SUPV_HELPER_EXECUTING";
 | 
			
		||||
const char *SUPV_MPSOC_SHUTDOWN_BUILD_FAILED_STRING = "SUPV_MPSOC_SHUTDOWN_BUILD_FAILED";
 | 
			
		||||
const char *SUPV_ACK_UNKNOWN_COMMAND_STRING = "SUPV_ACK_UNKNOWN_COMMAND";
 | 
			
		||||
const char *SUPV_EXE_ACK_UNKNOWN_COMMAND_STRING = "SUPV_EXE_ACK_UNKNOWN_COMMAND";
 | 
			
		||||
const char *SANITIZATION_FAILED_STRING = "SANITIZATION_FAILED";
 | 
			
		||||
const char *MOUNTED_SD_CARD_STRING = "MOUNTED_SD_CARD";
 | 
			
		||||
const char *SEND_MRAM_DUMP_FAILED_STRING = "SEND_MRAM_DUMP_FAILED";
 | 
			
		||||
@@ -245,7 +236,6 @@ const char *SIDE_SWITCH_TRANSITION_NOT_ALLOWED_12903_STRING = "SIDE_SWITCH_TRANS
 | 
			
		||||
const char *CHILDREN_LOST_MODE_STRING = "CHILDREN_LOST_MODE";
 | 
			
		||||
const char *GPS_FIX_CHANGE_STRING = "GPS_FIX_CHANGE";
 | 
			
		||||
const char *CANT_GET_FIX_STRING = "CANT_GET_FIX";
 | 
			
		||||
const char *RESET_FAIL_STRING = "RESET_FAIL";
 | 
			
		||||
const char *P60_BOOT_COUNT_STRING = "P60_BOOT_COUNT";
 | 
			
		||||
const char *BATT_MODE_STRING = "BATT_MODE";
 | 
			
		||||
const char *BATT_MODE_CHANGED_STRING = "BATT_MODE_CHANGED";
 | 
			
		||||
@@ -488,15 +478,9 @@ const char *translateEvents(Event event) {
 | 
			
		||||
    case (8900):
 | 
			
		||||
      return CLOCK_SET_STRING;
 | 
			
		||||
    case (8901):
 | 
			
		||||
      return CLOCK_DUMP_LEGACY_STRING;
 | 
			
		||||
      return CLOCK_DUMP_STRING;
 | 
			
		||||
    case (8902):
 | 
			
		||||
      return CLOCK_SET_FAILURE_STRING;
 | 
			
		||||
    case (8903):
 | 
			
		||||
      return CLOCK_DUMP_STRING;
 | 
			
		||||
    case (8904):
 | 
			
		||||
      return CLOCK_DUMP_BEFORE_SETTING_TIME_STRING;
 | 
			
		||||
    case (8905):
 | 
			
		||||
      return CLOCK_DUMP_AFTER_SETTING_TIME_STRING;
 | 
			
		||||
    case (9100):
 | 
			
		||||
      return TC_DELETION_FAILED_STRING;
 | 
			
		||||
    case (9700):
 | 
			
		||||
@@ -518,7 +502,7 @@ const char *translateEvents(Event event) {
 | 
			
		||||
    case (11200):
 | 
			
		||||
      return SAFE_RATE_VIOLATION_STRING;
 | 
			
		||||
    case (11201):
 | 
			
		||||
      return RATE_RECOVERY_STRING;
 | 
			
		||||
      return SAFE_RATE_RECOVERY_STRING;
 | 
			
		||||
    case (11202):
 | 
			
		||||
      return MULTIPLE_RW_INVALID_STRING;
 | 
			
		||||
    case (11203):
 | 
			
		||||
@@ -528,17 +512,11 @@ const char *translateEvents(Event event) {
 | 
			
		||||
    case (11205):
 | 
			
		||||
      return MEKF_AUTOMATIC_RESET_STRING;
 | 
			
		||||
    case (11206):
 | 
			
		||||
      return PTG_CTRL_NO_ATTITUDE_INFORMATION_STRING;
 | 
			
		||||
      return MEKF_INVALID_MODE_VIOLATION_STRING;
 | 
			
		||||
    case (11207):
 | 
			
		||||
      return SAFE_MODE_CONTROLLER_FAILURE_STRING;
 | 
			
		||||
    case (11208):
 | 
			
		||||
      return TLE_TOO_OLD_STRING;
 | 
			
		||||
    case (11209):
 | 
			
		||||
      return TLE_FILE_READ_FAILED_STRING;
 | 
			
		||||
    case (11210):
 | 
			
		||||
      return PTG_RATE_VIOLATION_STRING;
 | 
			
		||||
    case (11211):
 | 
			
		||||
      return DETUMBLE_TRANSITION_FAILED_STRING;
 | 
			
		||||
    case (11300):
 | 
			
		||||
      return SWITCH_CMD_SENT_STRING;
 | 
			
		||||
    case (11301):
 | 
			
		||||
@@ -607,8 +585,6 @@ const char *translateEvents(Event event) {
 | 
			
		||||
      return SUPV_NOT_ON_STRING;
 | 
			
		||||
    case (11608):
 | 
			
		||||
      return SUPV_REPLY_TIMEOUT_STRING;
 | 
			
		||||
    case (11609):
 | 
			
		||||
      return CAM_MUST_BE_ON_FOR_SNAPSHOT_MODE_STRING;
 | 
			
		||||
    case (11701):
 | 
			
		||||
      return SELF_TEST_I2C_FAILURE_STRING;
 | 
			
		||||
    case (11702):
 | 
			
		||||
@@ -651,10 +627,6 @@ const char *translateEvents(Event event) {
 | 
			
		||||
      return SUPV_HELPER_EXECUTING_STRING;
 | 
			
		||||
    case (12008):
 | 
			
		||||
      return SUPV_MPSOC_SHUTDOWN_BUILD_FAILED_STRING;
 | 
			
		||||
    case (12009):
 | 
			
		||||
      return SUPV_ACK_UNKNOWN_COMMAND_STRING;
 | 
			
		||||
    case (12010):
 | 
			
		||||
      return SUPV_EXE_ACK_UNKNOWN_COMMAND_STRING;
 | 
			
		||||
    case (12100):
 | 
			
		||||
      return SANITIZATION_FAILED_STRING;
 | 
			
		||||
    case (12101):
 | 
			
		||||
@@ -813,8 +785,6 @@ const char *translateEvents(Event event) {
 | 
			
		||||
      return GPS_FIX_CHANGE_STRING;
 | 
			
		||||
    case (13101):
 | 
			
		||||
      return CANT_GET_FIX_STRING;
 | 
			
		||||
    case (13102):
 | 
			
		||||
      return RESET_FAIL_STRING;
 | 
			
		||||
    case (13200):
 | 
			
		||||
      return P60_BOOT_COUNT_STRING;
 | 
			
		||||
    case (13201):
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,8 @@
 | 
			
		||||
/**
 | 
			
		||||
 * @brief  Auto-generated object translation file.
 | 
			
		||||
 * @details
 | 
			
		||||
 * Contains 180 translations.
 | 
			
		||||
 * Generated on: 2024-05-06 13:47:38
 | 
			
		||||
 * Contains 179 translations.
 | 
			
		||||
 * Generated on: 2023-10-27 14:24:05
 | 
			
		||||
 */
 | 
			
		||||
#include "translateObjects.h"
 | 
			
		||||
 | 
			
		||||
@@ -64,7 +64,6 @@ const char *PTME_VC3_CFDP_TM_STRING = "PTME_VC3_CFDP_TM";
 | 
			
		||||
const char *PLOC_MPSOC_HANDLER_STRING = "PLOC_MPSOC_HANDLER";
 | 
			
		||||
const char *PLOC_SUPERVISOR_HANDLER_STRING = "PLOC_SUPERVISOR_HANDLER";
 | 
			
		||||
const char *PLOC_SUPERVISOR_HELPER_STRING = "PLOC_SUPERVISOR_HELPER";
 | 
			
		||||
const char *PLOC_MPSOC_COMMUNICATION_STRING = "PLOC_MPSOC_COMMUNICATION";
 | 
			
		||||
const char *SCEX_STRING = "SCEX";
 | 
			
		||||
const char *SOLAR_ARRAY_DEPL_HANDLER_STRING = "SOLAR_ARRAY_DEPL_HANDLER";
 | 
			
		||||
const char *HEATER_HANDLER_STRING = "HEATER_HANDLER";
 | 
			
		||||
@@ -305,8 +304,6 @@ const char *translateObject(object_id_t object) {
 | 
			
		||||
      return PLOC_SUPERVISOR_HANDLER_STRING;
 | 
			
		||||
    case 0x44330017:
 | 
			
		||||
      return PLOC_SUPERVISOR_HELPER_STRING;
 | 
			
		||||
    case 0x44330018:
 | 
			
		||||
      return PLOC_MPSOC_COMMUNICATION_STRING;
 | 
			
		||||
    case 0x44330032:
 | 
			
		||||
      return SCEX_STRING;
 | 
			
		||||
    case 0x444100A2:
 | 
			
		||||
 
 | 
			
		||||
@@ -24,10 +24,14 @@
 | 
			
		||||
 | 
			
		||||
#include "OBSWConfig.h"
 | 
			
		||||
#include "devConf.h"
 | 
			
		||||
#include "devices/addresses.h"
 | 
			
		||||
#include "devices/gpioIds.h"
 | 
			
		||||
#include "eive/definitions.h"
 | 
			
		||||
#include "mission/system/acs/acsModeTree.h"
 | 
			
		||||
#include "mission/system/payload/payloadModeTree.h"
 | 
			
		||||
#include "mission/system/power/epsModeTree.h"
 | 
			
		||||
#include "mission/system/tcs/tcsModeTree.h"
 | 
			
		||||
#include "mission/system/tree/payloadModeTree.h"
 | 
			
		||||
#include "mission/tcs/defs.h"
 | 
			
		||||
 | 
			
		||||
void ObjectFactory::createSunSensorComponents(GpioIF* gpioComIF, SpiComIF* spiComIF,
 | 
			
		||||
                                              PowerSwitchIF& pwrSwitcher, std::string spiDev,
 | 
			
		||||
@@ -331,9 +335,8 @@ void ObjectFactory::createScexComponents(std::string uartDev, PowerSwitchIF* pwr
 | 
			
		||||
  scexHandler->connectModeTreeParent(satsystem::payload::SUBSYSTEM);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
AcsController* ObjectFactory::createAcsController(bool connectSubsystem, bool enableHkSets,
 | 
			
		||||
                                                  SdCardMountedIF& mountedIF) {
 | 
			
		||||
  auto acsCtrl = new AcsController(objects::ACS_CONTROLLER, enableHkSets, mountedIF);
 | 
			
		||||
AcsController* ObjectFactory::createAcsController(bool connectSubsystem, bool enableHkSets) {
 | 
			
		||||
  auto acsCtrl = new AcsController(objects::ACS_CONTROLLER, enableHkSets);
 | 
			
		||||
  if (connectSubsystem) {
 | 
			
		||||
    acsCtrl->connectModeTreeParent(satsystem::acs::ACS_SUBSYSTEM);
 | 
			
		||||
  }
 | 
			
		||||
 
 | 
			
		||||
@@ -31,8 +31,7 @@ void createScexComponents(std::string uartDev, PowerSwitchIF* pwrSwitcher,
 | 
			
		||||
 | 
			
		||||
void gpioChecker(ReturnValue_t result, std::string output);
 | 
			
		||||
 | 
			
		||||
AcsController* createAcsController(bool connectSubsystem, bool enableHkSets,
 | 
			
		||||
                                   SdCardMountedIF& mountedIF);
 | 
			
		||||
AcsController* createAcsController(bool connectSubsystem, bool enableHkSets);
 | 
			
		||||
PowerController* createPowerController(bool connectSubsystem, bool enableHkSets);
 | 
			
		||||
 | 
			
		||||
}  // namespace ObjectFactory
 | 
			
		||||
 
 | 
			
		||||
@@ -44,21 +44,24 @@ LocalPoolDataSetBase *GpsHyperionLinuxController::getDataSetHandle(sid_t sid) {
 | 
			
		||||
 | 
			
		||||
ReturnValue_t GpsHyperionLinuxController::checkModeCommand(Mode_t mode, Submode_t submode,
 | 
			
		||||
                                                           uint32_t *msToReachTheMode) {
 | 
			
		||||
  if (mode == MODE_ON) {
 | 
			
		||||
    maxTimeToReachFix.resetTimer();
 | 
			
		||||
    gainedNewFix.timeOut();
 | 
			
		||||
  } else if (mode == MODE_NORMAL) {
 | 
			
		||||
    return HasModesIF::INVALID_MODE;
 | 
			
		||||
  if (not modeCommanded) {
 | 
			
		||||
    if (mode == MODE_ON or mode == MODE_OFF) {
 | 
			
		||||
      // 5h time to reach fix
 | 
			
		||||
      *msToReachTheMode = MAX_SECONDS_TO_REACH_FIX;
 | 
			
		||||
      maxTimeToReachFix.resetTimer();
 | 
			
		||||
      modeCommanded = true;
 | 
			
		||||
    } else if (mode == MODE_NORMAL) {
 | 
			
		||||
      return HasModesIF::INVALID_MODE;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  if (mode == MODE_OFF) {
 | 
			
		||||
    maxTimeToReachFix.timeOut();
 | 
			
		||||
    gainedNewFix.timeOut();
 | 
			
		||||
    PoolReadGuard pg(&gpsSet);
 | 
			
		||||
    gpsSet.setValidity(false, true);
 | 
			
		||||
    // The ctrl is off, so it cannot detect the data from the devices.
 | 
			
		||||
    handleFixChangedEvent(GpsHyperion::FixMode::NOT_SEEN);
 | 
			
		||||
    gpsSet.fixMode.value = GpsHyperion::FixMode::NOT_SEEN;
 | 
			
		||||
    // There can't be a fix with a device that is off.
 | 
			
		||||
    triggerEvent(GpsHyperion::GPS_FIX_CHANGE, gpsSet.fixMode.value, 0);
 | 
			
		||||
    gpsSet.fixMode.value = 0;
 | 
			
		||||
    oneShotSwitches.reset();
 | 
			
		||||
    modeCommanded = false;
 | 
			
		||||
  }
 | 
			
		||||
  return returnvalue::OK;
 | 
			
		||||
}
 | 
			
		||||
@@ -72,16 +75,13 @@ ReturnValue_t GpsHyperionLinuxController::executeAction(ActionId_t actionId,
 | 
			
		||||
        PoolReadGuard pg(&gpsSet);
 | 
			
		||||
        // Set HK entries invalid
 | 
			
		||||
        gpsSet.setValidity(false, true);
 | 
			
		||||
        ReturnValue_t result = resetCallback(data, size, resetCallbackArgs);
 | 
			
		||||
        if (result != returnvalue::OK) {
 | 
			
		||||
          return result;
 | 
			
		||||
        }
 | 
			
		||||
        resetCallback(data, size, resetCallbackArgs);
 | 
			
		||||
        return HasActionsIF::EXECUTION_FINISHED;
 | 
			
		||||
      }
 | 
			
		||||
      return DeviceHandlerIF::COMMAND_NOT_IMPLEMENTED;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  return HasActionsIF::INVALID_ACTION_ID;
 | 
			
		||||
  return returnvalue::OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ReturnValue_t GpsHyperionLinuxController::initializeLocalDataPool(
 | 
			
		||||
@@ -100,7 +100,7 @@ ReturnValue_t GpsHyperionLinuxController::initializeLocalDataPool(
 | 
			
		||||
  localDataPoolMap.emplace(GpsHyperion::SATS_IN_USE, new PoolEntry<uint8_t>());
 | 
			
		||||
  localDataPoolMap.emplace(GpsHyperion::SATS_IN_VIEW, new PoolEntry<uint8_t>());
 | 
			
		||||
  localDataPoolMap.emplace(GpsHyperion::FIX_MODE, new PoolEntry<uint8_t>());
 | 
			
		||||
  poolManager.subscribeForRegularPeriodicPacket({gpsSet.getSid(), enableHkSets, 60.0});
 | 
			
		||||
  poolManager.subscribeForRegularPeriodicPacket({gpsSet.getSid(), enableHkSets, 30.0});
 | 
			
		||||
  localDataPoolMap.emplace(GpsHyperion::SKYVIEW_UNIX_SECONDS, new PoolEntry<double>());
 | 
			
		||||
  localDataPoolMap.emplace(GpsHyperion::PRN_ID, new PoolEntry<int16_t>());
 | 
			
		||||
  localDataPoolMap.emplace(GpsHyperion::AZIMUTH, new PoolEntry<int16_t>());
 | 
			
		||||
@@ -216,9 +216,15 @@ ReturnValue_t GpsHyperionLinuxController::handleGpsReadData() {
 | 
			
		||||
  bool modeIsSet = true;
 | 
			
		||||
  if (MODE_SET != (MODE_SET & gps.set)) {
 | 
			
		||||
    if (mode != MODE_OFF) {
 | 
			
		||||
      if (maxTimeToReachFix.hasTimedOut() and oneShotSwitches.cantGetFixSwitch) {
 | 
			
		||||
        sif::warning << "GpsHyperionLinuxController: No mode could be set in allowed "
 | 
			
		||||
                     << maxTimeToReachFix.getTimeoutMs() / 1000 << " seconds" << std::endl;
 | 
			
		||||
        triggerEvent(GpsHyperion::CANT_GET_FIX, maxTimeToReachFix.getTimeoutMs());
 | 
			
		||||
        oneShotSwitches.cantGetFixSwitch = false;
 | 
			
		||||
      }
 | 
			
		||||
      modeIsSet = false;
 | 
			
		||||
    } else {
 | 
			
		||||
      // GPS ctrl is off anyway, so do other handling
 | 
			
		||||
      // GPS device is off anyway, so do other handling
 | 
			
		||||
      return returnvalue::FAILED;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
@@ -243,44 +249,27 @@ ReturnValue_t GpsHyperionLinuxController::handleCoreTelemetry(bool modeIsSet) {
 | 
			
		||||
  uint8_t newFix = 0;
 | 
			
		||||
  if (modeIsSet) {
 | 
			
		||||
    // 0: Not seen, 1: No fix, 2: 2D-Fix, 3: 3D-Fix
 | 
			
		||||
    if (gps.fix.mode == GpsHyperion::FixMode::FIX_2D or
 | 
			
		||||
        gps.fix.mode == GpsHyperion::FixMode::FIX_3D) {
 | 
			
		||||
    if (gps.fix.mode == 2 or gps.fix.mode == 3) {
 | 
			
		||||
      validFix = true;
 | 
			
		||||
      maxTimeToReachFix.resetTimer();
 | 
			
		||||
    }
 | 
			
		||||
    newFix = gps.fix.mode;
 | 
			
		||||
  }
 | 
			
		||||
  if (gpsSet.fixMode.value != newFix) {
 | 
			
		||||
    handleFixChangedEvent(newFix);
 | 
			
		||||
  }
 | 
			
		||||
  gpsSet.fixMode = newFix;
 | 
			
		||||
  gpsSet.fixMode.setValid(modeIsSet);
 | 
			
		||||
  // We are supposed to be on and functioning, but no fix was found
 | 
			
		||||
  if (not validFix) {
 | 
			
		||||
    if (maxTimeToReachFix.hasTimedOut()) {
 | 
			
		||||
      // Set HK entries invalid
 | 
			
		||||
      gpsSet.setValidity(false, true);
 | 
			
		||||
      if (oneShotSwitches.cantGetFixSwitch) {
 | 
			
		||||
        sif::warning << "GpsHyperionLinuxController: No fix detected in allowed "
 | 
			
		||||
                     << maxTimeToReachFix.getTimeoutMs() / 1000 << " seconds" << std::endl;
 | 
			
		||||
        triggerEvent(GpsHyperion::CANT_GET_FIX, maxTimeToReachFix.getTimeoutMs());
 | 
			
		||||
        oneShotSwitches.cantGetFixSwitch = false;
 | 
			
		||||
        // Try resetting the devices
 | 
			
		||||
        if (resetCallback != nullptr) {
 | 
			
		||||
          uint8_t chip = GpsHyperion::GnssChip::A_SIDE;
 | 
			
		||||
          ReturnValue_t result = resetCallback(&chip, 1, resetCallbackArgs);
 | 
			
		||||
          if (result != returnvalue::OK) {
 | 
			
		||||
            triggerEvent(GpsHyperion::RESET_FAIL, chip);
 | 
			
		||||
          }
 | 
			
		||||
          chip = GpsHyperion::GnssChip::B_SIDE;
 | 
			
		||||
          result = resetCallback(&chip, 1, resetCallbackArgs);
 | 
			
		||||
          if (result != returnvalue::OK) {
 | 
			
		||||
            triggerEvent(GpsHyperion::RESET_FAIL, chip);
 | 
			
		||||
          }
 | 
			
		||||
    if (newFix == 0 or newFix == 1) {
 | 
			
		||||
      if (modeCommanded and maxTimeToReachFix.hasTimedOut()) {
 | 
			
		||||
        // We are supposed to be on and functioning, but no fix was found
 | 
			
		||||
        if (mode == MODE_ON or mode == MODE_NORMAL) {
 | 
			
		||||
          mode = MODE_OFF;
 | 
			
		||||
        }
 | 
			
		||||
        modeCommanded = false;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  if (gpsSet.fixMode.value != newFix) {
 | 
			
		||||
#if OBSW_Q7S_EM != 1
 | 
			
		||||
    triggerEvent(GpsHyperion::GPS_FIX_CHANGE, gpsSet.fixMode.value, newFix);
 | 
			
		||||
#endif
 | 
			
		||||
  }
 | 
			
		||||
  gpsSet.fixMode = newFix;
 | 
			
		||||
  gpsSet.fixMode.setValid(modeIsSet);
 | 
			
		||||
 | 
			
		||||
  // Only set on specific messages, so only set a valid flag to invalid
 | 
			
		||||
  // if not set for more than a full message set (10 messages here)
 | 
			
		||||
@@ -293,12 +282,9 @@ ReturnValue_t GpsHyperionLinuxController::handleCoreTelemetry(bool modeIsSet) {
 | 
			
		||||
    }
 | 
			
		||||
    satNotSetCounter = 0;
 | 
			
		||||
  } else {
 | 
			
		||||
    if (satNotSetCounter < 10) {
 | 
			
		||||
      satNotSetCounter++;
 | 
			
		||||
    } else {
 | 
			
		||||
      gpsSet.satInUse.value = 0;
 | 
			
		||||
    satNotSetCounter++;
 | 
			
		||||
    if (gpsSet.satInUse.isValid() and satNotSetCounter >= 10) {
 | 
			
		||||
      gpsSet.satInUse.setValid(false);
 | 
			
		||||
      gpsSet.satInView.value = 0;
 | 
			
		||||
      gpsSet.satInView.setValid(false);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
@@ -306,24 +292,22 @@ ReturnValue_t GpsHyperionLinuxController::handleCoreTelemetry(bool modeIsSet) {
 | 
			
		||||
  // LATLON is set for every message, no need for a counter
 | 
			
		||||
  bool latValid = false;
 | 
			
		||||
  bool longValid = false;
 | 
			
		||||
  if (modeIsSet) {
 | 
			
		||||
    if (LATLON_SET == (LATLON_SET & gps.set)) {
 | 
			
		||||
      if (std::isfinite(gps.fix.latitude)) {
 | 
			
		||||
        // Negative latitude -> South direction
 | 
			
		||||
        gpsSet.latitude.value = gps.fix.latitude;
 | 
			
		||||
        // As specified in gps.h: Only valid if mode >= 2
 | 
			
		||||
        if (gps.fix.mode >= GpsHyperion::FixMode::FIX_2D) {
 | 
			
		||||
          latValid = true;
 | 
			
		||||
        }
 | 
			
		||||
  if (LATLON_SET == (LATLON_SET & gps.set)) {
 | 
			
		||||
    if (std::isfinite(gps.fix.latitude)) {
 | 
			
		||||
      // Negative latitude -> South direction
 | 
			
		||||
      gpsSet.latitude.value = gps.fix.latitude;
 | 
			
		||||
      // As specified in gps.h: Only valid if mode >= 2
 | 
			
		||||
      if (gps.fix.mode >= 2) {
 | 
			
		||||
        latValid = true;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
      if (std::isfinite(gps.fix.longitude)) {
 | 
			
		||||
        // Negative longitude -> West direction
 | 
			
		||||
        gpsSet.longitude.value = gps.fix.longitude;
 | 
			
		||||
        // As specified in gps.h: Only valid if mode >= 2
 | 
			
		||||
        if (gps.fix.mode >= GpsHyperion::FixMode::FIX_2D) {
 | 
			
		||||
          longValid = true;
 | 
			
		||||
        }
 | 
			
		||||
    if (std::isfinite(gps.fix.longitude)) {
 | 
			
		||||
      // Negative longitude -> West direction
 | 
			
		||||
      gpsSet.longitude.value = gps.fix.longitude;
 | 
			
		||||
      // As specified in gps.h: Only valid if mode >= 2
 | 
			
		||||
      if (gps.fix.mode >= 2) {
 | 
			
		||||
        longValid = true;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
@@ -332,24 +316,20 @@ ReturnValue_t GpsHyperionLinuxController::handleCoreTelemetry(bool modeIsSet) {
 | 
			
		||||
 | 
			
		||||
  // ALTITUDE is set for every message, no need for a counter
 | 
			
		||||
  bool altitudeValid = false;
 | 
			
		||||
  if (modeIsSet) {
 | 
			
		||||
    if (ALTITUDE_SET == (ALTITUDE_SET & gps.set) && std::isfinite(gps.fix.altitude)) {
 | 
			
		||||
      gpsSet.altitude.value = gps.fix.altitude;
 | 
			
		||||
      // As specified in gps.h: Only valid if mode == 3
 | 
			
		||||
      if (gps.fix.mode == GpsHyperion::FixMode::FIX_3D) {
 | 
			
		||||
        altitudeValid = true;
 | 
			
		||||
      }
 | 
			
		||||
  if (ALTITUDE_SET == (ALTITUDE_SET & gps.set) && std::isfinite(gps.fix.altitude)) {
 | 
			
		||||
    gpsSet.altitude.value = gps.fix.altitude;
 | 
			
		||||
    // As specified in gps.h: Only valid if mode == 3
 | 
			
		||||
    if (gps.fix.mode == 3) {
 | 
			
		||||
      altitudeValid = true;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  gpsSet.altitude.setValid(altitudeValid);
 | 
			
		||||
 | 
			
		||||
  // SPEED is set for every message, no need for a counter
 | 
			
		||||
  bool speedValid = false;
 | 
			
		||||
  if (modeIsSet) {
 | 
			
		||||
    if (SPEED_SET == (SPEED_SET & gps.set) && std::isfinite(gps.fix.speed)) {
 | 
			
		||||
      gpsSet.speed.value = gps.fix.speed;
 | 
			
		||||
      speedValid = true;
 | 
			
		||||
    }
 | 
			
		||||
  if (SPEED_SET == (SPEED_SET & gps.set) && std::isfinite(gps.fix.speed)) {
 | 
			
		||||
    gpsSet.speed.value = gps.fix.speed;
 | 
			
		||||
    speedValid = true;
 | 
			
		||||
  }
 | 
			
		||||
  gpsSet.speed.setValid(speedValid);
 | 
			
		||||
 | 
			
		||||
@@ -450,14 +430,3 @@ void GpsHyperionLinuxController::overwriteTimeIfNotSane(timeval time, bool valid
 | 
			
		||||
    timeInit = true;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void GpsHyperionLinuxController::handleFixChangedEvent(uint8_t newFix) {
 | 
			
		||||
  if (gainedNewFix.hasTimedOut()) {
 | 
			
		||||
    triggerEvent(GpsHyperion::GPS_FIX_CHANGE, newFix, fixChangeCounter);
 | 
			
		||||
    fixChangeCounter = 0;
 | 
			
		||||
    gainedNewFix.resetTimer();
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
  fixChangeCounter++;
 | 
			
		||||
  gainedNewFix.resetTimer();
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,13 +1,14 @@
 | 
			
		||||
#ifndef MISSION_DEVICES_GPSHYPERIONHANDLER_H_
 | 
			
		||||
#define MISSION_DEVICES_GPSHYPERIONHANDLER_H_
 | 
			
		||||
 | 
			
		||||
#include <common/config/eive/eventSubsystemIds.h>
 | 
			
		||||
#include <fsfw/FSFW.h>
 | 
			
		||||
#include <fsfw/controller/ExtendedControllerBase.h>
 | 
			
		||||
#include <fsfw/devicehandlers/DeviceHandlerBase.h>
 | 
			
		||||
#include <linux/acs/GPSDefinitions.h>
 | 
			
		||||
#include <mission/acs/archive/GPSDefinitions.h>
 | 
			
		||||
#include <mission/utility/trace.h>
 | 
			
		||||
 | 
			
		||||
#include "eive/eventSubsystemIds.h"
 | 
			
		||||
#include "fsfw/FSFW.h"
 | 
			
		||||
#include "fsfw/controller/ExtendedControllerBase.h"
 | 
			
		||||
#include "fsfw/devicehandlers/DeviceHandlerBase.h"
 | 
			
		||||
 | 
			
		||||
#ifdef FSFW_OSAL_LINUX
 | 
			
		||||
#include <gps.h>
 | 
			
		||||
#include <libgpsmm.h>
 | 
			
		||||
@@ -23,8 +24,8 @@
 | 
			
		||||
 */
 | 
			
		||||
class GpsHyperionLinuxController : public ExtendedControllerBase {
 | 
			
		||||
 public:
 | 
			
		||||
  // 15 minutes
 | 
			
		||||
  static constexpr uint32_t MAX_SECONDS_TO_REACH_FIX = 60 * 15;
 | 
			
		||||
  // 30 minutes
 | 
			
		||||
  static constexpr uint32_t MAX_SECONDS_TO_REACH_FIX = 60 * 30;
 | 
			
		||||
 | 
			
		||||
  enum ReadModes { SHM = 0, SOCKET = 1 };
 | 
			
		||||
 | 
			
		||||
@@ -64,8 +65,7 @@ class GpsHyperionLinuxController : public ExtendedControllerBase {
 | 
			
		||||
  const char* currentClientBuf = nullptr;
 | 
			
		||||
  ReadModes readMode = ReadModes::SOCKET;
 | 
			
		||||
  Countdown maxTimeToReachFix = Countdown(MAX_SECONDS_TO_REACH_FIX * 1000);
 | 
			
		||||
  Countdown gainedNewFix = Countdown(60 * 2 * 1000);
 | 
			
		||||
  uint32_t fixChangeCounter = 0;
 | 
			
		||||
  bool modeCommanded = false;
 | 
			
		||||
  bool timeInit = false;
 | 
			
		||||
  uint8_t satNotSetCounter = 0;
 | 
			
		||||
 | 
			
		||||
@@ -92,8 +92,6 @@ class GpsHyperionLinuxController : public ExtendedControllerBase {
 | 
			
		||||
  // we set it with the roughly valid time from the GPS. For some reason, NTP might only work
 | 
			
		||||
  // if the time difference between sys time and current time is not too large
 | 
			
		||||
  void overwriteTimeIfNotSane(timeval time, bool validFix);
 | 
			
		||||
 | 
			
		||||
  void handleFixChangedEvent(uint8_t newFix);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif /* MISSION_DEVICES_GPSHYPERIONHANDLER_H_ */
 | 
			
		||||
 
 | 
			
		||||
@@ -54,7 +54,7 @@ ReturnValue_t StrComHandler::performOperation(uint8_t operationCode) {
 | 
			
		||||
    switch (state) {
 | 
			
		||||
      case InternalState::POLL_ONE_REPLY: {
 | 
			
		||||
        // Stopwatch watch;
 | 
			
		||||
        replyTimeout.setTimeout(400);
 | 
			
		||||
        replyTimeout.setTimeout(200);
 | 
			
		||||
        readOneReply(static_cast<uint32_t>(state));
 | 
			
		||||
        {
 | 
			
		||||
          MutexGuard mg(lock);
 | 
			
		||||
@@ -175,8 +175,7 @@ void StrComHandler::setDownloadImageName(std::string filename) {
 | 
			
		||||
 | 
			
		||||
void StrComHandler::setFlashReadFilename(std::string filename) { flashRead.filename = filename; }
 | 
			
		||||
 | 
			
		||||
ReturnValue_t StrComHandler::startFirmwareUpdate(std::string fullname,
 | 
			
		||||
                                                 startracker::FirmwareTarget target) {
 | 
			
		||||
ReturnValue_t StrComHandler::startFirmwareUpdate(std::string fullname) {
 | 
			
		||||
  {
 | 
			
		||||
    MutexGuard mg(lock);
 | 
			
		||||
    if (state != InternalState::SLEEPING) {
 | 
			
		||||
@@ -193,13 +192,8 @@ ReturnValue_t StrComHandler::startFirmwareUpdate(std::string fullname,
 | 
			
		||||
  if (not std::filesystem::exists(flashWrite.fullname)) {
 | 
			
		||||
    return FILE_NOT_EXISTS;
 | 
			
		||||
  }
 | 
			
		||||
  if (target == startracker::FirmwareTarget::MAIN) {
 | 
			
		||||
    flashWrite.firstRegion = static_cast<uint8_t>(startracker::FirmwareRegions::FIRST_MAIN);
 | 
			
		||||
    flashWrite.lastRegion = static_cast<uint8_t>(startracker::FirmwareRegions::LAST_MAIN);
 | 
			
		||||
  } else if (target == startracker::FirmwareTarget::BACKUP) {
 | 
			
		||||
    flashWrite.firstRegion = static_cast<uint8_t>(startracker::FirmwareRegions::FIRST_BACKUP);
 | 
			
		||||
    flashWrite.lastRegion = static_cast<uint8_t>(startracker::FirmwareRegions::LAST_BACKUP);
 | 
			
		||||
  }
 | 
			
		||||
  flashWrite.firstRegion = static_cast<uint8_t>(startracker::FirmwareRegions::FIRST);
 | 
			
		||||
  flashWrite.lastRegion = static_cast<uint8_t>(startracker::FirmwareRegions::LAST);
 | 
			
		||||
  {
 | 
			
		||||
    MutexGuard mg(lock);
 | 
			
		||||
    replyWasReceived = false;
 | 
			
		||||
@@ -270,7 +264,7 @@ ReturnValue_t StrComHandler::performImageDownload() {
 | 
			
		||||
      file.close();
 | 
			
		||||
      return returnvalue::OK;
 | 
			
		||||
    }
 | 
			
		||||
    prv_arc_pack_download_action_req(&downloadReq, cmdBuf.data(), &size);
 | 
			
		||||
    arc_pack_download_action_req(&downloadReq, cmdBuf.data(), &size);
 | 
			
		||||
    result = sendAndRead(size, downloadReq.position);
 | 
			
		||||
    if (result != returnvalue::OK) {
 | 
			
		||||
      if (retries < CONFIG_MAX_DOWNLOAD_RETRIES) {
 | 
			
		||||
@@ -281,7 +275,7 @@ ReturnValue_t StrComHandler::performImageDownload() {
 | 
			
		||||
      file.close();
 | 
			
		||||
      return result;
 | 
			
		||||
    }
 | 
			
		||||
    result = checkActionReply(replySize, "downloading image");
 | 
			
		||||
    result = checkActionReply(replySize);
 | 
			
		||||
    if (result != returnvalue::OK) {
 | 
			
		||||
      if (retries < CONFIG_MAX_DOWNLOAD_RETRIES) {
 | 
			
		||||
        serial::flushRxBuf(serialPort);
 | 
			
		||||
@@ -349,12 +343,12 @@ ReturnValue_t StrComHandler::performImageUpload() {
 | 
			
		||||
    }
 | 
			
		||||
    file.seekg(uploadReq.position * SIZE_IMAGE_PART, file.beg);
 | 
			
		||||
    file.read(reinterpret_cast<char*>(uploadReq.data), SIZE_IMAGE_PART);
 | 
			
		||||
    prv_arc_pack_upload_action_req(&uploadReq, cmdBuf.data(), &size);
 | 
			
		||||
    arc_pack_upload_action_req(&uploadReq, cmdBuf.data(), &size);
 | 
			
		||||
    result = sendAndRead(size, uploadReq.position);
 | 
			
		||||
    if (result != returnvalue::OK) {
 | 
			
		||||
      return returnvalue::FAILED;
 | 
			
		||||
    }
 | 
			
		||||
    result = checkActionReply(replyLen, "sky image upload");
 | 
			
		||||
    result = checkActionReply(replyLen);
 | 
			
		||||
    if (result != returnvalue::OK) {
 | 
			
		||||
      return result;
 | 
			
		||||
    }
 | 
			
		||||
@@ -375,12 +369,12 @@ ReturnValue_t StrComHandler::performImageUpload() {
 | 
			
		||||
    file.seekg(fullChunks * SIZE_IMAGE_PART, file.beg);
 | 
			
		||||
    file.read(reinterpret_cast<char*>(uploadReq.data), remainder);
 | 
			
		||||
    file.close();
 | 
			
		||||
    prv_arc_pack_upload_action_req(&uploadReq, cmdBuf.data(), &size);
 | 
			
		||||
    arc_pack_upload_action_req(&uploadReq, cmdBuf.data(), &size);
 | 
			
		||||
    result = sendAndRead(size, uploadReq.position);
 | 
			
		||||
    if (result != returnvalue::OK) {
 | 
			
		||||
      return returnvalue::FAILED;
 | 
			
		||||
    }
 | 
			
		||||
    result = checkActionReply(replyLen, "sky image upload");
 | 
			
		||||
    result = checkActionReply(replyLen);
 | 
			
		||||
    if (result != returnvalue::OK) {
 | 
			
		||||
      return result;
 | 
			
		||||
    }
 | 
			
		||||
@@ -394,7 +388,8 @@ ReturnValue_t StrComHandler::performImageUpload() {
 | 
			
		||||
ReturnValue_t StrComHandler::performFirmwareUpdate() {
 | 
			
		||||
  using namespace startracker;
 | 
			
		||||
  ReturnValue_t result = returnvalue::OK;
 | 
			
		||||
  result = unlockAndEraseRegions(flashWrite.firstRegion, flashWrite.lastRegion);
 | 
			
		||||
  result = unlockAndEraseRegions(static_cast<uint32_t>(startracker::FirmwareRegions::FIRST),
 | 
			
		||||
                                 static_cast<uint32_t>(startracker::FirmwareRegions::LAST));
 | 
			
		||||
  if (result != returnvalue::OK) {
 | 
			
		||||
    return result;
 | 
			
		||||
  }
 | 
			
		||||
@@ -445,12 +440,12 @@ ReturnValue_t StrComHandler::performFlashWrite() {
 | 
			
		||||
      bytesWrittenInRegion = 0;
 | 
			
		||||
    }
 | 
			
		||||
    req.address = bytesWrittenInRegion;
 | 
			
		||||
    prv_arc_pack_write_action_req(&req, cmdBuf.data(), &size);
 | 
			
		||||
    arc_pack_write_action_req(&req, cmdBuf.data(), &size);
 | 
			
		||||
    result = sendAndRead(size, req.address);
 | 
			
		||||
    if (result != returnvalue::OK) {
 | 
			
		||||
      return result;
 | 
			
		||||
    }
 | 
			
		||||
    result = checkActionReply(replyLen, "firmware image upload");
 | 
			
		||||
    result = checkActionReply(replyLen);
 | 
			
		||||
    if (result != returnvalue::OK) {
 | 
			
		||||
      return result;
 | 
			
		||||
    }
 | 
			
		||||
@@ -488,12 +483,12 @@ ReturnValue_t StrComHandler::performFlashWrite() {
 | 
			
		||||
    req.length = remainingBytes;
 | 
			
		||||
    totalBytesWritten += CHUNK_SIZE;
 | 
			
		||||
    bytesWrittenInRegion += remainingBytes;
 | 
			
		||||
    prv_arc_pack_write_action_req(&req, cmdBuf.data(), &size);
 | 
			
		||||
    arc_pack_write_action_req(&req, cmdBuf.data(), &size);
 | 
			
		||||
    result = sendAndRead(size, req.address);
 | 
			
		||||
    if (result != returnvalue::OK) {
 | 
			
		||||
      return result;
 | 
			
		||||
    }
 | 
			
		||||
    result = checkActionReply(replyLen, "flash write");
 | 
			
		||||
    result = checkActionReply(replyLen);
 | 
			
		||||
    if (result != returnvalue::OK) {
 | 
			
		||||
      return result;
 | 
			
		||||
    }
 | 
			
		||||
@@ -536,7 +531,7 @@ ReturnValue_t StrComHandler::performFlashRead() {
 | 
			
		||||
    } else {
 | 
			
		||||
      req.length = CHUNK_SIZE;
 | 
			
		||||
    }
 | 
			
		||||
    prv_arc_pack_read_action_req(&req, cmdBuf.data(), &size);
 | 
			
		||||
    arc_pack_read_action_req(&req, cmdBuf.data(), &size);
 | 
			
		||||
    result = sendAndRead(size, req.address);
 | 
			
		||||
    if (result != returnvalue::OK) {
 | 
			
		||||
      if (retries < CONFIG_MAX_DOWNLOAD_RETRIES) {
 | 
			
		||||
@@ -547,7 +542,7 @@ ReturnValue_t StrComHandler::performFlashRead() {
 | 
			
		||||
      file.close();
 | 
			
		||||
      return result;
 | 
			
		||||
    }
 | 
			
		||||
    result = checkActionReply(replyLen, "flash read");
 | 
			
		||||
    result = checkActionReply(replyLen);
 | 
			
		||||
    if (result != returnvalue::OK) {
 | 
			
		||||
      if (retries < CONFIG_MAX_DOWNLOAD_RETRIES) {
 | 
			
		||||
        serial::flushRxBuf(serialPort);
 | 
			
		||||
@@ -589,7 +584,7 @@ ReturnValue_t StrComHandler::sendAndRead(size_t size, uint32_t failParameter) {
 | 
			
		||||
  return readOneReply(failParameter);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ReturnValue_t StrComHandler::checkActionReply(size_t replySize, const char* context) {
 | 
			
		||||
ReturnValue_t StrComHandler::checkActionReply(size_t replySize) {
 | 
			
		||||
  uint8_t type = startracker::getReplyFrameType(replyPtr);
 | 
			
		||||
  if (type != TMTC_ACTIONREPLY) {
 | 
			
		||||
    sif::warning << "StrHelper::checkActionReply: Received reply with invalid type ID" << std::endl;
 | 
			
		||||
@@ -597,7 +592,7 @@ ReturnValue_t StrComHandler::checkActionReply(size_t replySize, const char* cont
 | 
			
		||||
  }
 | 
			
		||||
  uint8_t status = startracker::getStatusField(replyPtr);
 | 
			
		||||
  if (status != ArcsecDatalinkLayer::STATUS_OK) {
 | 
			
		||||
    sif::warning << "StrHelper::checkActionReply: Status failure for " << context << ": "
 | 
			
		||||
    sif::warning << "StrHelper::checkActionReply: Status failure: "
 | 
			
		||||
                 << static_cast<unsigned int>(status) << std::endl;
 | 
			
		||||
    return STATUS_ERROR;
 | 
			
		||||
  }
 | 
			
		||||
@@ -725,7 +720,7 @@ ReturnValue_t StrComHandler::readReceivedMessage(CookieIF* cookie, uint8_t** buf
 | 
			
		||||
  {
 | 
			
		||||
    MutexGuard mg(lock);
 | 
			
		||||
    if (state != InternalState::SLEEPING) {
 | 
			
		||||
      return BUSY;
 | 
			
		||||
      return returnvalue::OK;
 | 
			
		||||
    }
 | 
			
		||||
    replyWasReceived = this->replyWasReceived;
 | 
			
		||||
  }
 | 
			
		||||
@@ -738,7 +733,7 @@ ReturnValue_t StrComHandler::readReceivedMessage(CookieIF* cookie, uint8_t** buf
 | 
			
		||||
    *size = replyLen;
 | 
			
		||||
  }
 | 
			
		||||
  replyLen = 0;
 | 
			
		||||
  return replyResult;
 | 
			
		||||
  return returnvalue::OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ReturnValue_t StrComHandler::unlockAndEraseRegions(uint32_t from, uint32_t to) {
 | 
			
		||||
@@ -749,26 +744,23 @@ ReturnValue_t StrComHandler::unlockAndEraseRegions(uint32_t from, uint32_t to) {
 | 
			
		||||
  struct UnlockActionRequest unlockReq;
 | 
			
		||||
  struct EraseActionRequest eraseReq;
 | 
			
		||||
  uint32_t size = 0;
 | 
			
		||||
  for (uint32_t idx = from; idx < to; idx++) {
 | 
			
		||||
  for (uint32_t idx = from; idx <= to; idx++) {
 | 
			
		||||
    unlockReq.region = idx;
 | 
			
		||||
    unlockReq.code = startracker::region_secrets::SECRETS[idx];
 | 
			
		||||
    prv_arc_pack_unlock_action_req(&unlockReq, cmdBuf.data(), &size);
 | 
			
		||||
    unlockReq.code = startracker::region_secrets::secret[idx];
 | 
			
		||||
    arc_pack_unlock_action_req(&unlockReq, cmdBuf.data(), &size);
 | 
			
		||||
    result = sendAndRead(size, unlockReq.region);
 | 
			
		||||
    if (result != returnvalue::OK) {
 | 
			
		||||
      return result;
 | 
			
		||||
    }
 | 
			
		||||
    result = checkActionReply(replyLen, "unlocking region");
 | 
			
		||||
    result = checkActionReply(replyLen);
 | 
			
		||||
    if (result != returnvalue::OK) {
 | 
			
		||||
      sif::warning << "StrHelper::unlockAndEraseRegions: Failed to unlock region with id "
 | 
			
		||||
                   << static_cast<unsigned int>(unlockReq.region) << std::endl;
 | 
			
		||||
      return result;
 | 
			
		||||
    }
 | 
			
		||||
    eraseReq.region = idx;
 | 
			
		||||
    prv_arc_pack_erase_action_req(&eraseReq, cmdBuf.data(), &size);
 | 
			
		||||
    arc_pack_erase_action_req(&eraseReq, cmdBuf.data(), &size);
 | 
			
		||||
    result = sendAndRead(size, eraseReq.region);
 | 
			
		||||
    if (result != returnvalue::OK) {
 | 
			
		||||
    }
 | 
			
		||||
    result = checkActionReply(replyLen, "erasing region");
 | 
			
		||||
    if (result != returnvalue::OK) {
 | 
			
		||||
      sif::warning << "StrHelper::unlockAndEraseRegions: Failed to erase region with id "
 | 
			
		||||
                   << static_cast<unsigned int>(eraseReq.region) << std::endl;
 | 
			
		||||
 
 | 
			
		||||
@@ -6,7 +6,6 @@
 | 
			
		||||
#include <string>
 | 
			
		||||
 | 
			
		||||
#include "OBSWConfig.h"
 | 
			
		||||
#include "mission/acs/str/strHelpers.h"
 | 
			
		||||
 | 
			
		||||
#ifdef XIPHOS_Q7S
 | 
			
		||||
#include "bsp_q7s/fs/SdCardManager.h"
 | 
			
		||||
@@ -128,7 +127,7 @@ class StrComHandler : public SystemObject, public DeviceCommunicationIF, public
 | 
			
		||||
   * @param fullname    Full name including absolute path of file containing firmware
 | 
			
		||||
   *                    update.
 | 
			
		||||
   */
 | 
			
		||||
  ReturnValue_t startFirmwareUpdate(std::string fullname, startracker::FirmwareTarget target);
 | 
			
		||||
  ReturnValue_t startFirmwareUpdate(std::string fullname);
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @brief   Starts the flash read procedure
 | 
			
		||||
@@ -335,7 +334,7 @@ class StrComHandler : public SystemObject, public DeviceCommunicationIF, public
 | 
			
		||||
   *
 | 
			
		||||
   * @return  returnvalue::OK if reply confirms success of packet transfer, otherwise REUTRN_FAILED
 | 
			
		||||
   */
 | 
			
		||||
  ReturnValue_t checkActionReply(size_t replySize, const char *context);
 | 
			
		||||
  ReturnValue_t checkActionReply(size_t replySize);
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @brief   Checks the position field in a star tracker upload/download reply.
 | 
			
		||||
 
 | 
			
		||||
@@ -28,7 +28,7 @@ class SyrlinksComHandler : public DeviceCommunicationIF,
 | 
			
		||||
  MutexIF *lock;
 | 
			
		||||
  SemaphoreIF *semaphore;
 | 
			
		||||
  int serialPort = 0;
 | 
			
		||||
  struct termios tty{};
 | 
			
		||||
  struct termios tty {};
 | 
			
		||||
  Countdown replyTimeout = Countdown(2000);
 | 
			
		||||
  std::array<uint8_t, 2048> recBuf{};
 | 
			
		||||
  SimpleRingBuffer ringBuf;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
/**
 | 
			
		||||
 * @brief    Auto-generated event translation file. Contains 325 translations.
 | 
			
		||||
 * @brief    Auto-generated event translation file. Contains 315 translations.
 | 
			
		||||
 * @details
 | 
			
		||||
 * Generated on: 2024-05-06 13:47:38
 | 
			
		||||
 * Generated on: 2023-10-27 14:24:05
 | 
			
		||||
 */
 | 
			
		||||
#include "translateEvents.h"
 | 
			
		||||
 | 
			
		||||
@@ -82,11 +82,8 @@ const char *BIT_LOCK_STRING = "BIT_LOCK";
 | 
			
		||||
const char *BIT_LOCK_LOST_STRING = "BIT_LOCK_LOST";
 | 
			
		||||
const char *FRAME_PROCESSING_FAILED_STRING = "FRAME_PROCESSING_FAILED";
 | 
			
		||||
const char *CLOCK_SET_STRING = "CLOCK_SET";
 | 
			
		||||
const char *CLOCK_DUMP_LEGACY_STRING = "CLOCK_DUMP_LEGACY";
 | 
			
		||||
const char *CLOCK_SET_FAILURE_STRING = "CLOCK_SET_FAILURE";
 | 
			
		||||
const char *CLOCK_DUMP_STRING = "CLOCK_DUMP";
 | 
			
		||||
const char *CLOCK_DUMP_BEFORE_SETTING_TIME_STRING = "CLOCK_DUMP_BEFORE_SETTING_TIME";
 | 
			
		||||
const char *CLOCK_DUMP_AFTER_SETTING_TIME_STRING = "CLOCK_DUMP_AFTER_SETTING_TIME";
 | 
			
		||||
const char *CLOCK_SET_FAILURE_STRING = "CLOCK_SET_FAILURE";
 | 
			
		||||
const char *TC_DELETION_FAILED_STRING = "TC_DELETION_FAILED";
 | 
			
		||||
const char *TEST_STRING = "TEST";
 | 
			
		||||
const char *CHANGE_OF_SETUP_PARAMETER_STRING = "CHANGE_OF_SETUP_PARAMETER";
 | 
			
		||||
@@ -97,17 +94,14 @@ const char *FILESTORE_ERROR_STRING = "FILESTORE_ERROR";
 | 
			
		||||
const char *FILENAME_TOO_LARGE_ERROR_STRING = "FILENAME_TOO_LARGE_ERROR";
 | 
			
		||||
const char *HANDLING_CFDP_REQUEST_FAILED_STRING = "HANDLING_CFDP_REQUEST_FAILED";
 | 
			
		||||
const char *SAFE_RATE_VIOLATION_STRING = "SAFE_RATE_VIOLATION";
 | 
			
		||||
const char *RATE_RECOVERY_STRING = "RATE_RECOVERY";
 | 
			
		||||
const char *SAFE_RATE_RECOVERY_STRING = "SAFE_RATE_RECOVERY";
 | 
			
		||||
const char *MULTIPLE_RW_INVALID_STRING = "MULTIPLE_RW_INVALID";
 | 
			
		||||
const char *MEKF_INVALID_INFO_STRING = "MEKF_INVALID_INFO";
 | 
			
		||||
const char *MEKF_RECOVERY_STRING = "MEKF_RECOVERY";
 | 
			
		||||
const char *MEKF_AUTOMATIC_RESET_STRING = "MEKF_AUTOMATIC_RESET";
 | 
			
		||||
const char *PTG_CTRL_NO_ATTITUDE_INFORMATION_STRING = "PTG_CTRL_NO_ATTITUDE_INFORMATION";
 | 
			
		||||
const char *MEKF_INVALID_MODE_VIOLATION_STRING = "MEKF_INVALID_MODE_VIOLATION";
 | 
			
		||||
const char *SAFE_MODE_CONTROLLER_FAILURE_STRING = "SAFE_MODE_CONTROLLER_FAILURE";
 | 
			
		||||
const char *TLE_TOO_OLD_STRING = "TLE_TOO_OLD";
 | 
			
		||||
const char *TLE_FILE_READ_FAILED_STRING = "TLE_FILE_READ_FAILED";
 | 
			
		||||
const char *PTG_RATE_VIOLATION_STRING = "PTG_RATE_VIOLATION";
 | 
			
		||||
const char *DETUMBLE_TRANSITION_FAILED_STRING = "DETUMBLE_TRANSITION_FAILED";
 | 
			
		||||
const char *SWITCH_CMD_SENT_STRING = "SWITCH_CMD_SENT";
 | 
			
		||||
const char *SWITCH_HAS_CHANGED_STRING = "SWITCH_HAS_CHANGED";
 | 
			
		||||
const char *SWITCHING_Q7S_DENIED_STRING = "SWITCHING_Q7S_DENIED";
 | 
			
		||||
@@ -142,7 +136,6 @@ const char *MPSOC_HANDLER_SEQUENCE_COUNT_MISMATCH_STRING = "MPSOC_HANDLER_SEQUEN
 | 
			
		||||
const char *MPSOC_SHUTDOWN_FAILED_STRING = "MPSOC_SHUTDOWN_FAILED";
 | 
			
		||||
const char *SUPV_NOT_ON_STRING = "SUPV_NOT_ON";
 | 
			
		||||
const char *SUPV_REPLY_TIMEOUT_STRING = "SUPV_REPLY_TIMEOUT";
 | 
			
		||||
const char *CAM_MUST_BE_ON_FOR_SNAPSHOT_MODE_STRING = "CAM_MUST_BE_ON_FOR_SNAPSHOT_MODE";
 | 
			
		||||
const char *SELF_TEST_I2C_FAILURE_STRING = "SELF_TEST_I2C_FAILURE";
 | 
			
		||||
const char *SELF_TEST_SPI_FAILURE_STRING = "SELF_TEST_SPI_FAILURE";
 | 
			
		||||
const char *SELF_TEST_ADC_FAILURE_STRING = "SELF_TEST_ADC_FAILURE";
 | 
			
		||||
@@ -164,8 +157,6 @@ const char *SUPV_EXE_FAILURE_STRING = "SUPV_EXE_FAILURE";
 | 
			
		||||
const char *SUPV_CRC_FAILURE_EVENT_STRING = "SUPV_CRC_FAILURE_EVENT";
 | 
			
		||||
const char *SUPV_HELPER_EXECUTING_STRING = "SUPV_HELPER_EXECUTING";
 | 
			
		||||
const char *SUPV_MPSOC_SHUTDOWN_BUILD_FAILED_STRING = "SUPV_MPSOC_SHUTDOWN_BUILD_FAILED";
 | 
			
		||||
const char *SUPV_ACK_UNKNOWN_COMMAND_STRING = "SUPV_ACK_UNKNOWN_COMMAND";
 | 
			
		||||
const char *SUPV_EXE_ACK_UNKNOWN_COMMAND_STRING = "SUPV_EXE_ACK_UNKNOWN_COMMAND";
 | 
			
		||||
const char *SANITIZATION_FAILED_STRING = "SANITIZATION_FAILED";
 | 
			
		||||
const char *MOUNTED_SD_CARD_STRING = "MOUNTED_SD_CARD";
 | 
			
		||||
const char *SEND_MRAM_DUMP_FAILED_STRING = "SEND_MRAM_DUMP_FAILED";
 | 
			
		||||
@@ -245,7 +236,6 @@ const char *SIDE_SWITCH_TRANSITION_NOT_ALLOWED_12903_STRING = "SIDE_SWITCH_TRANS
 | 
			
		||||
const char *CHILDREN_LOST_MODE_STRING = "CHILDREN_LOST_MODE";
 | 
			
		||||
const char *GPS_FIX_CHANGE_STRING = "GPS_FIX_CHANGE";
 | 
			
		||||
const char *CANT_GET_FIX_STRING = "CANT_GET_FIX";
 | 
			
		||||
const char *RESET_FAIL_STRING = "RESET_FAIL";
 | 
			
		||||
const char *P60_BOOT_COUNT_STRING = "P60_BOOT_COUNT";
 | 
			
		||||
const char *BATT_MODE_STRING = "BATT_MODE";
 | 
			
		||||
const char *BATT_MODE_CHANGED_STRING = "BATT_MODE_CHANGED";
 | 
			
		||||
@@ -488,15 +478,9 @@ const char *translateEvents(Event event) {
 | 
			
		||||
    case (8900):
 | 
			
		||||
      return CLOCK_SET_STRING;
 | 
			
		||||
    case (8901):
 | 
			
		||||
      return CLOCK_DUMP_LEGACY_STRING;
 | 
			
		||||
      return CLOCK_DUMP_STRING;
 | 
			
		||||
    case (8902):
 | 
			
		||||
      return CLOCK_SET_FAILURE_STRING;
 | 
			
		||||
    case (8903):
 | 
			
		||||
      return CLOCK_DUMP_STRING;
 | 
			
		||||
    case (8904):
 | 
			
		||||
      return CLOCK_DUMP_BEFORE_SETTING_TIME_STRING;
 | 
			
		||||
    case (8905):
 | 
			
		||||
      return CLOCK_DUMP_AFTER_SETTING_TIME_STRING;
 | 
			
		||||
    case (9100):
 | 
			
		||||
      return TC_DELETION_FAILED_STRING;
 | 
			
		||||
    case (9700):
 | 
			
		||||
@@ -518,7 +502,7 @@ const char *translateEvents(Event event) {
 | 
			
		||||
    case (11200):
 | 
			
		||||
      return SAFE_RATE_VIOLATION_STRING;
 | 
			
		||||
    case (11201):
 | 
			
		||||
      return RATE_RECOVERY_STRING;
 | 
			
		||||
      return SAFE_RATE_RECOVERY_STRING;
 | 
			
		||||
    case (11202):
 | 
			
		||||
      return MULTIPLE_RW_INVALID_STRING;
 | 
			
		||||
    case (11203):
 | 
			
		||||
@@ -528,17 +512,11 @@ const char *translateEvents(Event event) {
 | 
			
		||||
    case (11205):
 | 
			
		||||
      return MEKF_AUTOMATIC_RESET_STRING;
 | 
			
		||||
    case (11206):
 | 
			
		||||
      return PTG_CTRL_NO_ATTITUDE_INFORMATION_STRING;
 | 
			
		||||
      return MEKF_INVALID_MODE_VIOLATION_STRING;
 | 
			
		||||
    case (11207):
 | 
			
		||||
      return SAFE_MODE_CONTROLLER_FAILURE_STRING;
 | 
			
		||||
    case (11208):
 | 
			
		||||
      return TLE_TOO_OLD_STRING;
 | 
			
		||||
    case (11209):
 | 
			
		||||
      return TLE_FILE_READ_FAILED_STRING;
 | 
			
		||||
    case (11210):
 | 
			
		||||
      return PTG_RATE_VIOLATION_STRING;
 | 
			
		||||
    case (11211):
 | 
			
		||||
      return DETUMBLE_TRANSITION_FAILED_STRING;
 | 
			
		||||
    case (11300):
 | 
			
		||||
      return SWITCH_CMD_SENT_STRING;
 | 
			
		||||
    case (11301):
 | 
			
		||||
@@ -607,8 +585,6 @@ const char *translateEvents(Event event) {
 | 
			
		||||
      return SUPV_NOT_ON_STRING;
 | 
			
		||||
    case (11608):
 | 
			
		||||
      return SUPV_REPLY_TIMEOUT_STRING;
 | 
			
		||||
    case (11609):
 | 
			
		||||
      return CAM_MUST_BE_ON_FOR_SNAPSHOT_MODE_STRING;
 | 
			
		||||
    case (11701):
 | 
			
		||||
      return SELF_TEST_I2C_FAILURE_STRING;
 | 
			
		||||
    case (11702):
 | 
			
		||||
@@ -651,10 +627,6 @@ const char *translateEvents(Event event) {
 | 
			
		||||
      return SUPV_HELPER_EXECUTING_STRING;
 | 
			
		||||
    case (12008):
 | 
			
		||||
      return SUPV_MPSOC_SHUTDOWN_BUILD_FAILED_STRING;
 | 
			
		||||
    case (12009):
 | 
			
		||||
      return SUPV_ACK_UNKNOWN_COMMAND_STRING;
 | 
			
		||||
    case (12010):
 | 
			
		||||
      return SUPV_EXE_ACK_UNKNOWN_COMMAND_STRING;
 | 
			
		||||
    case (12100):
 | 
			
		||||
      return SANITIZATION_FAILED_STRING;
 | 
			
		||||
    case (12101):
 | 
			
		||||
@@ -813,8 +785,6 @@ const char *translateEvents(Event event) {
 | 
			
		||||
      return GPS_FIX_CHANGE_STRING;
 | 
			
		||||
    case (13101):
 | 
			
		||||
      return CANT_GET_FIX_STRING;
 | 
			
		||||
    case (13102):
 | 
			
		||||
      return RESET_FAIL_STRING;
 | 
			
		||||
    case (13200):
 | 
			
		||||
      return P60_BOOT_COUNT_STRING;
 | 
			
		||||
    case (13201):
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,8 @@
 | 
			
		||||
/**
 | 
			
		||||
 * @brief  Auto-generated object translation file.
 | 
			
		||||
 * @details
 | 
			
		||||
 * Contains 180 translations.
 | 
			
		||||
 * Generated on: 2024-05-06 13:47:38
 | 
			
		||||
 * Contains 179 translations.
 | 
			
		||||
 * Generated on: 2023-10-27 14:24:05
 | 
			
		||||
 */
 | 
			
		||||
#include "translateObjects.h"
 | 
			
		||||
 | 
			
		||||
@@ -64,7 +64,6 @@ const char *PTME_VC3_CFDP_TM_STRING = "PTME_VC3_CFDP_TM";
 | 
			
		||||
const char *PLOC_MPSOC_HANDLER_STRING = "PLOC_MPSOC_HANDLER";
 | 
			
		||||
const char *PLOC_SUPERVISOR_HANDLER_STRING = "PLOC_SUPERVISOR_HANDLER";
 | 
			
		||||
const char *PLOC_SUPERVISOR_HELPER_STRING = "PLOC_SUPERVISOR_HELPER";
 | 
			
		||||
const char *PLOC_MPSOC_COMMUNICATION_STRING = "PLOC_MPSOC_COMMUNICATION";
 | 
			
		||||
const char *SCEX_STRING = "SCEX";
 | 
			
		||||
const char *SOLAR_ARRAY_DEPL_HANDLER_STRING = "SOLAR_ARRAY_DEPL_HANDLER";
 | 
			
		||||
const char *HEATER_HANDLER_STRING = "HEATER_HANDLER";
 | 
			
		||||
@@ -305,8 +304,6 @@ const char *translateObject(object_id_t object) {
 | 
			
		||||
      return PLOC_SUPERVISOR_HANDLER_STRING;
 | 
			
		||||
    case 0x44330017:
 | 
			
		||||
      return PLOC_SUPERVISOR_HELPER_STRING;
 | 
			
		||||
    case 0x44330018:
 | 
			
		||||
      return PLOC_MPSOC_COMMUNICATION_STRING;
 | 
			
		||||
    case 0x44330032:
 | 
			
		||||
      return SCEX_STRING;
 | 
			
		||||
    case 0x444100A2:
 | 
			
		||||
 
 | 
			
		||||
@@ -30,7 +30,6 @@ ReturnValue_t PapbVcInterface::initialize() {
 | 
			
		||||
ReturnValue_t PapbVcInterface::write(const uint8_t* data, size_t size, size_t& writtenSize) {
 | 
			
		||||
  // There are no packets smaller than 4, this is considered a configuration error.
 | 
			
		||||
  if (size < 4) {
 | 
			
		||||
    sif::warning << "PapbVcInterface::write: Passed packet smaller than 4 bytes" << std::endl;
 | 
			
		||||
    return returnvalue::FAILED;
 | 
			
		||||
  }
 | 
			
		||||
  // The user must call advance until completion before starting a new packet transfer.
 | 
			
		||||
@@ -84,9 +83,6 @@ ReturnValue_t PapbVcInterface::advanceWrite(size_t& writtenSize) {
 | 
			
		||||
    writtenSize++;
 | 
			
		||||
  }
 | 
			
		||||
  if (not pollReadyForOctet(MAX_BUSY_POLLS)) {
 | 
			
		||||
    if (not pollReadyForPacket()) {
 | 
			
		||||
      return PARTIALLY_WRITTEN;
 | 
			
		||||
    }
 | 
			
		||||
    abortPacketTransfer();
 | 
			
		||||
    return returnvalue::FAILED;
 | 
			
		||||
  }
 | 
			
		||||
 
 | 
			
		||||
@@ -24,15 +24,12 @@ using namespace pdec;
 | 
			
		||||
uint32_t PdecHandler::CURRENT_FAR = 0;
 | 
			
		||||
 | 
			
		||||
PdecHandler::PdecHandler(object_id_t objectId, object_id_t tcDestinationId,
 | 
			
		||||
                         LinuxLibgpioIF* gpioComIF, gpioId_t pdecReset, UioNames names,
 | 
			
		||||
                         uint32_t cfgMemPhyAddr, uint32_t pdecRamPhyAddr)
 | 
			
		||||
                         LinuxLibgpioIF* gpioComIF, gpioId_t pdecReset, UioNames names)
 | 
			
		||||
    : SystemObject(objectId),
 | 
			
		||||
      tcDestinationId(tcDestinationId),
 | 
			
		||||
      gpioComIF(gpioComIF),
 | 
			
		||||
      pdecReset(pdecReset),
 | 
			
		||||
      actionHelper(this, nullptr),
 | 
			
		||||
      cfgMemBaseAddr(cfgMemPhyAddr),
 | 
			
		||||
      pdecRamBaseAddr(pdecRamPhyAddr),
 | 
			
		||||
      uioNames(names),
 | 
			
		||||
      paramHelper(this) {
 | 
			
		||||
  auto mqArgs = MqArgs(objectId, static_cast<void*>(this));
 | 
			
		||||
@@ -70,7 +67,7 @@ ReturnValue_t PdecHandler::initialize() {
 | 
			
		||||
  };
 | 
			
		||||
  memoryBaseAddress = static_cast<uint32_t*>(
 | 
			
		||||
      mmap(0, PDEC_CFG_MEM_SIZE, static_cast<int>(UioMapper::Permissions::READ_WRITE), MAP_SHARED,
 | 
			
		||||
           fd, cfgMemBaseAddr));
 | 
			
		||||
           fd, PDEC_CFG_MEM_PHY_ADDR));
 | 
			
		||||
  if (memoryBaseAddress == nullptr) {
 | 
			
		||||
    return ObjectManagerIF::CHILD_INIT_FAILED;
 | 
			
		||||
  }
 | 
			
		||||
@@ -78,7 +75,7 @@ ReturnValue_t PdecHandler::initialize() {
 | 
			
		||||
 | 
			
		||||
  ramBaseAddress = static_cast<uint32_t*>(mmap(0, PDEC_RAM_SIZE,
 | 
			
		||||
                                               static_cast<int>(UioMapper::Permissions::READ_WRITE),
 | 
			
		||||
                                               MAP_SHARED, fd, pdecRamBaseAddr));
 | 
			
		||||
                                               MAP_SHARED, fd, PDEC_RAM_PHY_ADDR));
 | 
			
		||||
  if (ramBaseAddress == nullptr) {
 | 
			
		||||
    return ObjectManagerIF::CHILD_INIT_FAILED;
 | 
			
		||||
  }
 | 
			
		||||
@@ -468,7 +465,14 @@ bool PdecHandler::newTcReceived() {
 | 
			
		||||
  return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void PdecHandler::doPeriodicWork() { checkLocks(); }
 | 
			
		||||
void PdecHandler::doPeriodicWork() {
 | 
			
		||||
  // scuffed test code
 | 
			
		||||
  //  if(testCntr < 30) {
 | 
			
		||||
  //    triggerEvent(pdec::INVALID_TC_FRAME, FRAME_DIRTY_RETVAL);
 | 
			
		||||
  //    testCntr++;
 | 
			
		||||
  //  }
 | 
			
		||||
  checkLocks();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool PdecHandler::checkFrameAna(uint32_t pdecFar) {
 | 
			
		||||
  bool frameValid = false;
 | 
			
		||||
@@ -641,7 +645,7 @@ void PdecHandler::handleNewTc() {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ReturnValue_t PdecHandler::readTc(uint32_t& tcLength) {
 | 
			
		||||
  uint32_t tcOffset = (*(registerBaseAddress + PDEC_BPTR_OFFSET) - pdecRamBaseAddr) / 4;
 | 
			
		||||
  uint32_t tcOffset = (*(registerBaseAddress + PDEC_BPTR_OFFSET) - PHYSICAL_RAM_BASE_ADDRESS) / 4;
 | 
			
		||||
 | 
			
		||||
#if OBSW_DEBUG_PDEC_HANDLER == 1
 | 
			
		||||
  sif::debug << "PdecHandler::readTc: TC offset: 0x" << std::hex << tcOffset << std::endl;
 | 
			
		||||
 
 | 
			
		||||
@@ -52,7 +52,9 @@ class PdecHandler : public SystemObject,
 | 
			
		||||
 public:
 | 
			
		||||
  static constexpr dur_millis_t IRQ_TIMEOUT_MS = 500;
 | 
			
		||||
  static constexpr uint32_t PDEC_CFG_MEM_SIZE = 0x1000;
 | 
			
		||||
  static constexpr uint32_t PDEC_CFG_MEM_PHY_ADDR = 0x24000000;
 | 
			
		||||
  static constexpr uint32_t PDEC_RAM_SIZE = 0x10000;
 | 
			
		||||
  static constexpr uint32_t PDEC_RAM_PHY_ADDR = 0x26000000;
 | 
			
		||||
 | 
			
		||||
  enum class Modes { POLLED, IRQ };
 | 
			
		||||
 | 
			
		||||
@@ -66,7 +68,7 @@ class PdecHandler : public SystemObject,
 | 
			
		||||
   * @param uioregsiters  String of uio device file same mapped to the PDEC register space
 | 
			
		||||
   */
 | 
			
		||||
  PdecHandler(object_id_t objectId, object_id_t tcDestinationId, LinuxLibgpioIF* gpioComIF,
 | 
			
		||||
              gpioId_t pdecReset, UioNames names, uint32_t cfgMemPhyAddr, uint32_t pdecRamPhyAddr);
 | 
			
		||||
              gpioId_t pdecReset, UioNames names);
 | 
			
		||||
 | 
			
		||||
  virtual ~PdecHandler();
 | 
			
		||||
 | 
			
		||||
@@ -101,6 +103,12 @@ class PdecHandler : public SystemObject,
 | 
			
		||||
  static const size_t MAX_TC_SEGMENT_SIZE = 1017;
 | 
			
		||||
  static const uint8_t MAP_ID_MASK = 0x3F;
 | 
			
		||||
 | 
			
		||||
#ifdef TE0720_1CFA
 | 
			
		||||
  static const uint32_t PHYSICAL_RAM_BASE_ADDRESS = 0x32000000;
 | 
			
		||||
#else
 | 
			
		||||
  static const uint32_t PHYSICAL_RAM_BASE_ADDRESS = 0x26000000;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  // Expected value stored in FAR register after reset
 | 
			
		||||
  static const uint32_t FAR_RESET = 0x7FE0;
 | 
			
		||||
 | 
			
		||||
@@ -187,9 +195,6 @@ class PdecHandler : public SystemObject,
 | 
			
		||||
  MessageQueueId_t commandedBy = MessageQueueIF::NO_QUEUE;
 | 
			
		||||
  bool ptmeResetWithReinitializationPending = false;
 | 
			
		||||
 | 
			
		||||
  uint32_t cfgMemBaseAddr;
 | 
			
		||||
  uint32_t pdecRamBaseAddr;
 | 
			
		||||
 | 
			
		||||
  UioNames uioNames;
 | 
			
		||||
 | 
			
		||||
  ParameterHelper paramHelper;
 | 
			
		||||
 
 | 
			
		||||
@@ -14,7 +14,7 @@
 | 
			
		||||
 */
 | 
			
		||||
class PtmeIF {
 | 
			
		||||
 public:
 | 
			
		||||
  virtual ~PtmeIF() {};
 | 
			
		||||
  virtual ~PtmeIF(){};
 | 
			
		||||
 | 
			
		||||
  virtual bool containsVc(uint8_t vcId) const = 0;
 | 
			
		||||
  virtual VirtualChannelIF* getVirtChannel(uint8_t vcId) = 0;
 | 
			
		||||
 
 | 
			
		||||
@@ -15,7 +15,7 @@
 | 
			
		||||
 */
 | 
			
		||||
class VirtualChannelIF : public DirectTmSinkIF {
 | 
			
		||||
 public:
 | 
			
		||||
  virtual ~VirtualChannelIF() {};
 | 
			
		||||
  virtual ~VirtualChannelIF(){};
 | 
			
		||||
 | 
			
		||||
  virtual ReturnValue_t initialize() = 0;
 | 
			
		||||
  virtual void cancelTransfer() = 0;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,12 +1,10 @@
 | 
			
		||||
target_sources(
 | 
			
		||||
  ${OBSW_NAME}
 | 
			
		||||
  PUBLIC PlocMemoryDumper.cpp
 | 
			
		||||
         MpsocCommunication.cpp
 | 
			
		||||
         SerialCommunicationHelper.cpp
 | 
			
		||||
         FreshMpsocHandler.cpp
 | 
			
		||||
         FreshSupvHandler.cpp
 | 
			
		||||
         PlocMpsocHandler.cpp
 | 
			
		||||
         PlocMpsocSpecialComHelper.cpp
 | 
			
		||||
         plocMpsocHelpers.cpp
 | 
			
		||||
         PlocSupervisorHandler.cpp
 | 
			
		||||
         PlocSupvUartMan.cpp
 | 
			
		||||
         ScexDleParser.cpp
 | 
			
		||||
         ScexHelper.cpp
 | 
			
		||||
 
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -1,212 +0,0 @@
 | 
			
		||||
#include "fsfw/action/ActionMessage.h"
 | 
			
		||||
#include "fsfw/action/CommandsActionsIF.h"
 | 
			
		||||
#include "fsfw/devicehandlers/DeviceHandlerIF.h"
 | 
			
		||||
#include "fsfw/devicehandlers/FreshDeviceHandlerBase.h"
 | 
			
		||||
#include "fsfw/ipc/MessageQueueIF.h"
 | 
			
		||||
#include "fsfw/ipc/messageQueueDefinitions.h"
 | 
			
		||||
#include "fsfw/modes/ModeMessage.h"
 | 
			
		||||
#include "fsfw/objectmanager/SystemObjectIF.h"
 | 
			
		||||
#include "fsfw/power/PowerSwitchIF.h"
 | 
			
		||||
#include "fsfw/power/definitions.h"
 | 
			
		||||
#include "fsfw/returnvalues/returnvalue.h"
 | 
			
		||||
#include "fsfw_hal/linux/gpio/Gpio.h"
 | 
			
		||||
#include "linux/payload/MpsocCommunication.h"
 | 
			
		||||
#include "linux/payload/PlocMpsocSpecialComHelper.h"
 | 
			
		||||
#include "linux/payload/plocMpsocHelpers.h"
 | 
			
		||||
 | 
			
		||||
class FreshMpsocHandler : public FreshDeviceHandlerBase, public CommandsActionsIF {
 | 
			
		||||
 public:
 | 
			
		||||
  enum OpCode { DEFAULT_OPERATION = 0, PARSE_TM = 1 };
 | 
			
		||||
  static constexpr uint32_t MPSOC_MODE_CMD_TIMEOUT_MS = 120000;
 | 
			
		||||
 | 
			
		||||
  FreshMpsocHandler(DhbConfig cfg, MpsocCommunication& comInterface,
 | 
			
		||||
                    PlocMpsocSpecialComHelper& specialComHelper, Gpio uartIsolatorSwitch,
 | 
			
		||||
                    object_id_t supervisorHandler, PowerSwitchIF& powerSwitcher,
 | 
			
		||||
                    power::Switch_t camSwitchId);
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Periodic helper executed function, implemented by child class.
 | 
			
		||||
   */
 | 
			
		||||
  void performDeviceOperation(uint8_t opCode) override;
 | 
			
		||||
 | 
			
		||||
  void performDefaultDeviceOperation();
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Implemented by child class. Handle all command messages which are
 | 
			
		||||
   * not health, mode, action or housekeeping messages.
 | 
			
		||||
   * @param message
 | 
			
		||||
   * @return
 | 
			
		||||
   */
 | 
			
		||||
  ReturnValue_t handleCommandMessage(CommandMessage* message) override;
 | 
			
		||||
 | 
			
		||||
  ReturnValue_t initialize() override;
 | 
			
		||||
 | 
			
		||||
 private:
 | 
			
		||||
  enum class StartupState { IDLE, HW_INIT, DONE } startupState = StartupState::IDLE;
 | 
			
		||||
  enum class PowerState { IDLE, PENDING_STARTUP, PENDING_SHUTDOWN, SUPV_FAILED, DONE };
 | 
			
		||||
 | 
			
		||||
  enum TransitionState { NONE, TO_ON, TO_OFF, SUBMODE } transitionState = TransitionState::NONE;
 | 
			
		||||
  MpsocCommunication& comInterface;
 | 
			
		||||
  PlocMpsocSpecialComHelper& specialComHelper;
 | 
			
		||||
  MessageQueueIF* eventQueue = nullptr;
 | 
			
		||||
  SourceSequenceCounter commandSequenceCount = SourceSequenceCounter(0);
 | 
			
		||||
  MessageQueueIF* commandActionHelperQueue = nullptr;
 | 
			
		||||
  CommandActionHelper commandActionHelper;
 | 
			
		||||
  Gpio uartIsolatorSwitch;
 | 
			
		||||
  mpsoc::HkReport hkReport;
 | 
			
		||||
  object_id_t supervisorHandler;
 | 
			
		||||
 | 
			
		||||
  Countdown mpsocBootTransitionCd = Countdown(6500);
 | 
			
		||||
  Countdown supvTransitionCd = Countdown(3000);
 | 
			
		||||
 | 
			
		||||
  PoolEntry<uint32_t> peStatus = PoolEntry<uint32_t>();
 | 
			
		||||
  PoolEntry<uint8_t> peMode = PoolEntry<uint8_t>();
 | 
			
		||||
  PoolEntry<uint8_t> peDownlinkPwrOn = PoolEntry<uint8_t>();
 | 
			
		||||
  PoolEntry<uint8_t> peDownlinkReplyActive = PoolEntry<uint8_t>();
 | 
			
		||||
  PoolEntry<uint8_t> peDownlinkJesdSyncStatus = PoolEntry<uint8_t>();
 | 
			
		||||
  PoolEntry<uint8_t> peDownlinkDacStatus = PoolEntry<uint8_t>();
 | 
			
		||||
  PoolEntry<uint8_t> peCameraStatus = PoolEntry<uint8_t>();
 | 
			
		||||
  PoolEntry<uint8_t> peCameraSdiStatus = PoolEntry<uint8_t>();
 | 
			
		||||
  PoolEntry<float> peCameraFpgaTemp = PoolEntry<float>();
 | 
			
		||||
  PoolEntry<float> peCameraSocTemp = PoolEntry<float>();
 | 
			
		||||
  PoolEntry<float> peSysmonTemp = PoolEntry<float>();
 | 
			
		||||
  PoolEntry<float> peSysmonVccInt = PoolEntry<float>();
 | 
			
		||||
  PoolEntry<float> peSysmonVccAux = PoolEntry<float>();
 | 
			
		||||
  PoolEntry<float> peSysmonVccBram = PoolEntry<float>();
 | 
			
		||||
  PoolEntry<float> peSysmonVccPaux = PoolEntry<float>();
 | 
			
		||||
  PoolEntry<float> peSysmonVccPint = PoolEntry<float>();
 | 
			
		||||
  PoolEntry<float> peSysmonVccPdro = PoolEntry<float>();
 | 
			
		||||
  PoolEntry<float> peSysmonMb12V = PoolEntry<float>();
 | 
			
		||||
  PoolEntry<float> peSysmonMb3V3 = PoolEntry<float>();
 | 
			
		||||
  PoolEntry<float> peSysmonMb1V8 = PoolEntry<float>();
 | 
			
		||||
  PoolEntry<float> peSysmonVcc12V = PoolEntry<float>();
 | 
			
		||||
  PoolEntry<float> peSysmonVcc5V = PoolEntry<float>();
 | 
			
		||||
  PoolEntry<float> peSysmonVcc3V3 = PoolEntry<float>();
 | 
			
		||||
  PoolEntry<float> peSysmonVcc3V3VA = PoolEntry<float>();
 | 
			
		||||
  PoolEntry<float> peSysmonVcc2V5DDR = PoolEntry<float>();
 | 
			
		||||
  PoolEntry<float> peSysmonVcc1V2DDR = PoolEntry<float>();
 | 
			
		||||
  PoolEntry<float> peSysmonVcc0V9 = PoolEntry<float>();
 | 
			
		||||
  PoolEntry<float> peSysmonVcc0V6VTT = PoolEntry<float>();
 | 
			
		||||
  PoolEntry<float> peSysmonSafeCotsCur = PoolEntry<float>();
 | 
			
		||||
  PoolEntry<float> peSysmonNvm4XoCur = PoolEntry<float>();
 | 
			
		||||
  PoolEntry<uint16_t> peSemUncorrectableErrs = PoolEntry<uint16_t>();
 | 
			
		||||
  PoolEntry<uint16_t> peSemCorrectableErrs = PoolEntry<uint16_t>();
 | 
			
		||||
  PoolEntry<uint8_t> peSemStatus = PoolEntry<uint8_t>();
 | 
			
		||||
  PoolEntry<uint8_t> peRebootMpsocRequired = PoolEntry<uint8_t>();
 | 
			
		||||
 | 
			
		||||
  PowerState powerState;
 | 
			
		||||
  bool specialComHelperExecuting = false;
 | 
			
		||||
 | 
			
		||||
  struct ActionCommandInfo {
 | 
			
		||||
    Countdown cmdCountdown = Countdown(mpsoc::DEFAULT_CMD_TIMEOUT_MS);
 | 
			
		||||
    bool pending = false;
 | 
			
		||||
    MessageQueueId_t commandedBy = MessageQueueIF::NO_QUEUE;
 | 
			
		||||
    DeviceCommandId_t pendingCmd = DeviceHandlerIF::NO_COMMAND_ID;
 | 
			
		||||
    uint16_t pendingCmdMpsocApid = 0;
 | 
			
		||||
 | 
			
		||||
    void reset() {
 | 
			
		||||
      pending = false;
 | 
			
		||||
      commandedBy = MessageQueueIF::NO_QUEUE;
 | 
			
		||||
      pendingCmd = DeviceHandlerIF::NO_COMMAND_ID;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void start(DeviceCommandId_t commandId, MessageQueueId_t commandedBy) {
 | 
			
		||||
      pending = true;
 | 
			
		||||
      cmdCountdown.resetTimer();
 | 
			
		||||
      pendingCmd = commandId;
 | 
			
		||||
      this->commandedBy = commandedBy;
 | 
			
		||||
    }
 | 
			
		||||
  } activeCmdInfo;
 | 
			
		||||
 | 
			
		||||
  uint8_t commandBuffer[mpsoc::MAX_COMMAND_SIZE];
 | 
			
		||||
  SpacePacketCreator creator;
 | 
			
		||||
  ploc::SpTcParams spParams = ploc::SpTcParams(creator);
 | 
			
		||||
  Mode_t targetMode = HasModesIF::MODE_UNDEFINED;
 | 
			
		||||
  Submode_t targetSubmode = 0;
 | 
			
		||||
 | 
			
		||||
  struct TmMemReadReport {
 | 
			
		||||
    static const uint8_t FIX_SIZE = 14;
 | 
			
		||||
    size_t rememberRequestedSize = 0;
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  TmMemReadReport tmMemReadReport;
 | 
			
		||||
  uint32_t lastReplySequenceCount = 0;
 | 
			
		||||
  uint8_t skipSupvCommandingToOn = false;
 | 
			
		||||
  PowerSwitchIF& powerSwitcher;
 | 
			
		||||
  power::Switch_t camSwitchId;
 | 
			
		||||
 | 
			
		||||
  // HK manager abstract functions.
 | 
			
		||||
  LocalPoolDataSetBase* getDataSetHandle(sid_t sid) override;
 | 
			
		||||
  ReturnValue_t initializeLocalDataPool(localpool::DataPool& localDataPoolMap,
 | 
			
		||||
                                        LocalDataPoolManager& poolManager) override;
 | 
			
		||||
 | 
			
		||||
  // Mode abstract functions
 | 
			
		||||
  ReturnValue_t checkModeCommand(Mode_t mode, Submode_t submode,
 | 
			
		||||
                                 uint32_t* msToReachTheMode) override;
 | 
			
		||||
  // Action override. Forward to user.
 | 
			
		||||
  ReturnValue_t executeAction(ActionId_t actionId, MessageQueueId_t commandedBy,
 | 
			
		||||
                              const uint8_t* data, size_t size) override;
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @overload
 | 
			
		||||
   * @param submode
 | 
			
		||||
   */
 | 
			
		||||
  void startTransition(Mode_t newMode, Submode_t submode) override;
 | 
			
		||||
 | 
			
		||||
  ReturnValue_t performDeviceOperationPreQueueHandling(uint8_t opCode) override;
 | 
			
		||||
 | 
			
		||||
  // CommandsActionsIF overrides.
 | 
			
		||||
  MessageQueueIF* getCommandQueuePtr() override;
 | 
			
		||||
 | 
			
		||||
  void stepSuccessfulReceived(ActionId_t actionId, uint8_t step) override;
 | 
			
		||||
  void stepFailedReceived(ActionId_t actionId, uint8_t step, ReturnValue_t returnCode) override;
 | 
			
		||||
  void dataReceived(ActionId_t actionId, const uint8_t* data, uint32_t size) override;
 | 
			
		||||
  void completionSuccessfulReceived(ActionId_t actionId) override;
 | 
			
		||||
  void completionFailedReceived(ActionId_t actionId, ReturnValue_t returnCode) override;
 | 
			
		||||
  ReturnValue_t getParameter(uint8_t domainId, uint8_t uniqueId, ParameterWrapper* parameterWrapper,
 | 
			
		||||
                             const ParameterWrapper* newValues, uint16_t startAtIndex) override;
 | 
			
		||||
 | 
			
		||||
  void handleActionCommandFailure(ActionId_t actionId, ReturnValue_t returnCode);
 | 
			
		||||
  ReturnValue_t executeRegularCmd(ActionId_t actionId, MessageQueueId_t commandedBy,
 | 
			
		||||
                                  const uint8_t* data, size_t dataLen);
 | 
			
		||||
  void handleTransitionToOn();
 | 
			
		||||
  void handleTransitionToOff();
 | 
			
		||||
 | 
			
		||||
  ReturnValue_t commandTcModeReplay();
 | 
			
		||||
  ReturnValue_t commandTcMemWrite(const uint8_t* commandData, size_t commandDataLen);
 | 
			
		||||
  ReturnValue_t commandTcMemRead(const uint8_t* commandData, size_t commandDataLen);
 | 
			
		||||
  ReturnValue_t commandTcFlashDelete(const uint8_t* commandData, size_t commandDataLen);
 | 
			
		||||
  ReturnValue_t commandTcReplayStart(const uint8_t* commandData, size_t commandDataLen);
 | 
			
		||||
  ReturnValue_t commandTcReplayStop();
 | 
			
		||||
  ReturnValue_t commandTcDownlinkPwrOn(const uint8_t* commandData, size_t commandDataLen);
 | 
			
		||||
  ReturnValue_t commandTcDownlinkPwrOff();
 | 
			
		||||
  ReturnValue_t commandTcGetHkReport();
 | 
			
		||||
  ReturnValue_t commandTcGetDirContent(const uint8_t* commandData, size_t commandDataLen);
 | 
			
		||||
  ReturnValue_t commandTcReplayWriteSequence(const uint8_t* commandData, size_t commandDataLen);
 | 
			
		||||
  ReturnValue_t commandTcCamCmdSend(const uint8_t* commandData, size_t commandDataLen);
 | 
			
		||||
  ReturnValue_t commandTcModeIdle();
 | 
			
		||||
  ReturnValue_t commandTcCamTakePic(const uint8_t* commandData, size_t commandDataLen);
 | 
			
		||||
  ReturnValue_t commandTcSimplexStreamFile(const uint8_t* commandData, size_t commandDataLen);
 | 
			
		||||
  ReturnValue_t commandTcSplitFile(const uint8_t* commandData, size_t commandDataLen);
 | 
			
		||||
  ReturnValue_t commandTcDownlinkDataModulate(const uint8_t* commandData, size_t commandDataLen);
 | 
			
		||||
  ReturnValue_t commandTcModeSnapshot();
 | 
			
		||||
 | 
			
		||||
  ReturnValue_t finishAndSendTc(DeviceCommandId_t cmdId, mpsoc::TcBase& tcBase,
 | 
			
		||||
                                uint32_t cmdCountdown = mpsoc::DEFAULT_CMD_TIMEOUT_MS);
 | 
			
		||||
  void handleEvent(EventMessage* eventMessage);
 | 
			
		||||
  void cmdDoneHandler(bool success, ReturnValue_t result);
 | 
			
		||||
  ReturnValue_t handleDeviceReply();
 | 
			
		||||
  ReturnValue_t handleAckReport();
 | 
			
		||||
  ReturnValue_t handleExecutionReport();
 | 
			
		||||
  void sendFailureReport(DeviceCommandId_t replyId, ReturnValue_t status);
 | 
			
		||||
  ReturnValue_t reportReplyData(DeviceCommandId_t tmId);
 | 
			
		||||
  ReturnValue_t handleGetHkReport();
 | 
			
		||||
  bool handleHwStartup();
 | 
			
		||||
  bool handleHwShutdown();
 | 
			
		||||
 | 
			
		||||
  void stopSpecialComHelper();
 | 
			
		||||
  void commandSubmodeTransition();
 | 
			
		||||
  void commonSpecialComInit();
 | 
			
		||||
  void commonSpecialComStop();
 | 
			
		||||
  void commandInitHandling(ActionId_t actionId, MessageQueueId_t commandedBy);
 | 
			
		||||
};
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -1,188 +0,0 @@
 | 
			
		||||
#ifndef LINUX_PAYLOAD_FRESHSUPVHANDLER_H_
 | 
			
		||||
#define LINUX_PAYLOAD_FRESHSUPVHANDLER_H_
 | 
			
		||||
 | 
			
		||||
#include <fsfw/power/PowerSwitchIF.h>
 | 
			
		||||
#include <mission/controller/controllerdefinitions/PowerCtrlDefinitions.h>
 | 
			
		||||
 | 
			
		||||
#include <map>
 | 
			
		||||
 | 
			
		||||
#include "PlocSupvUartMan.h"
 | 
			
		||||
#include "fsfw/devicehandlers/FreshDeviceHandlerBase.h"
 | 
			
		||||
#include "fsfw/power/definitions.h"
 | 
			
		||||
#include "fsfw_hal/linux/gpio/Gpio.h"
 | 
			
		||||
#include "plocSupvDefs.h"
 | 
			
		||||
 | 
			
		||||
using supv::TcBase;
 | 
			
		||||
 | 
			
		||||
class FreshSupvHandler : public FreshDeviceHandlerBase {
 | 
			
		||||
 public:
 | 
			
		||||
  enum OpCode { DEFAULT_OPERATION = 0, PARSE_TM = 1 };
 | 
			
		||||
 | 
			
		||||
  FreshSupvHandler(DhbConfig cfg, CookieIF* comCookie, Gpio uartIsolatorSwitch,
 | 
			
		||||
                   PowerSwitchIF& switchIF, power::Switch_t powerSwitch);
 | 
			
		||||
  /**
 | 
			
		||||
   * Periodic helper executed function, implemented by child class.
 | 
			
		||||
   */
 | 
			
		||||
  void performDeviceOperation(uint8_t opCode) override;
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Implemented by child class. Handle all command messages which are
 | 
			
		||||
   * not health, mode, action or housekeeping messages.
 | 
			
		||||
   * @param message
 | 
			
		||||
   * @return
 | 
			
		||||
   */
 | 
			
		||||
  ReturnValue_t handleCommandMessage(CommandMessage* message) override;
 | 
			
		||||
 | 
			
		||||
  ReturnValue_t initialize() override;
 | 
			
		||||
 | 
			
		||||
 private:
 | 
			
		||||
  // HK manager abstract functions.
 | 
			
		||||
  LocalPoolDataSetBase* getDataSetHandle(sid_t sid) override;
 | 
			
		||||
  ReturnValue_t initializeLocalDataPool(localpool::DataPool& localDataPoolMap,
 | 
			
		||||
                                        LocalDataPoolManager& poolManager) override;
 | 
			
		||||
 | 
			
		||||
  // Mode abstract functions
 | 
			
		||||
  ReturnValue_t checkModeCommand(Mode_t mode, Submode_t submode,
 | 
			
		||||
                                 uint32_t* msToReachTheMode) override;
 | 
			
		||||
  // Action override. Forward to user.
 | 
			
		||||
  ReturnValue_t executeAction(ActionId_t actionId, MessageQueueId_t commandedBy,
 | 
			
		||||
                              const uint8_t* data, size_t size) override;
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @overload
 | 
			
		||||
   * @param submode
 | 
			
		||||
   */
 | 
			
		||||
  void startTransition(Mode_t newMode, Submode_t submode) override;
 | 
			
		||||
 | 
			
		||||
  ReturnValue_t performDeviceOperationPreQueueHandling(uint8_t opCode) override;
 | 
			
		||||
  void handleTransitionToOn();
 | 
			
		||||
  void handleTransitionToOff();
 | 
			
		||||
 | 
			
		||||
 private:
 | 
			
		||||
  static constexpr bool SET_TIME_DURING_BOOT = true;
 | 
			
		||||
  static const uint8_t SIZE_NULL_TERMINATOR = 1;
 | 
			
		||||
 | 
			
		||||
  enum class StartupState : uint8_t {
 | 
			
		||||
    IDLE,
 | 
			
		||||
    POWER_SWITCHING,
 | 
			
		||||
    BOOTING,
 | 
			
		||||
    SET_TIME,
 | 
			
		||||
    WAIT_FOR_TIME_REPLY,
 | 
			
		||||
    TIME_WAS_SET,
 | 
			
		||||
    ON
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  StartupState startupState = StartupState::IDLE;
 | 
			
		||||
  MessageQueueIF* eventQueue = nullptr;
 | 
			
		||||
  supv::TmBase tmReader;
 | 
			
		||||
 | 
			
		||||
  enum class ShutdownState : uint8_t { IDLE, POWER_SWITCHING };
 | 
			
		||||
  ShutdownState shutdownState = ShutdownState::IDLE;
 | 
			
		||||
 | 
			
		||||
  PlocSupvUartManager* uartManager;
 | 
			
		||||
  CookieIF* comCookie;
 | 
			
		||||
  PowerSwitchIF& switchIF;
 | 
			
		||||
  power::Switch_t switchId;
 | 
			
		||||
  Gpio uartIsolatorSwitch;
 | 
			
		||||
 | 
			
		||||
  supv::HkSet hkSet;
 | 
			
		||||
  supv::BootStatusReport bootStatusReport;
 | 
			
		||||
  supv::LatchupStatusReport latchupStatusReport;
 | 
			
		||||
  supv::CountersReport countersReport;
 | 
			
		||||
  supv::AdcReport adcReport;
 | 
			
		||||
 | 
			
		||||
  bool transitionActive = false;
 | 
			
		||||
 | 
			
		||||
  Mode_t targetMode = HasModesIF::MODE_INVALID;
 | 
			
		||||
  Submode_t targetSubmode = 0;
 | 
			
		||||
 | 
			
		||||
  Countdown switchTimeout = Countdown(2000);
 | 
			
		||||
  // Vorago nees some time to boot properly
 | 
			
		||||
  Countdown bootTimeout = Countdown(supv::BOOT_TIMEOUT_MS);
 | 
			
		||||
  // Countdown interCmdCd = Countdown(supv::INTER_COMMAND_DELAY);
 | 
			
		||||
 | 
			
		||||
  PoolEntry<uint16_t> adcRawEntry = PoolEntry<uint16_t>(16);
 | 
			
		||||
  PoolEntry<uint16_t> adcEngEntry = PoolEntry<uint16_t>(16);
 | 
			
		||||
  PoolEntry<uint32_t> latchupCounters = PoolEntry<uint32_t>(7);
 | 
			
		||||
  PoolEntry<uint8_t> fmcStateEntry = PoolEntry<uint8_t>(1);
 | 
			
		||||
  PoolEntry<uint8_t> bootStateEntry = PoolEntry<uint8_t>(1);
 | 
			
		||||
  PoolEntry<uint8_t> bootCyclesEntry = PoolEntry<uint8_t>(1);
 | 
			
		||||
  PoolEntry<uint32_t> tempSupEntry = PoolEntry<uint32_t>(1);
 | 
			
		||||
 | 
			
		||||
  pwrctrl::EnablePl enablePl = pwrctrl::EnablePl(objects::POWER_CONTROLLER);
 | 
			
		||||
 | 
			
		||||
  struct ActiveCmdInfo {
 | 
			
		||||
    ActiveCmdInfo(DeviceCommandId_t commandId, uint32_t cmdCountdownMs)
 | 
			
		||||
        : commandId(commandId), cmdCountdown(cmdCountdownMs) {}
 | 
			
		||||
 | 
			
		||||
    DeviceCommandId_t commandId = DeviceHandlerIF::NO_COMMAND_ID;
 | 
			
		||||
    bool isPending = false;
 | 
			
		||||
    bool ackRecv = false;
 | 
			
		||||
    bool ackExeRecv = false;
 | 
			
		||||
    bool replyPacketExpected = false;
 | 
			
		||||
    bool replyPacketReceived = false;
 | 
			
		||||
    MessageQueueId_t commandedBy = MessageQueueIF::NO_QUEUE;
 | 
			
		||||
    bool requiresActionReply = false;
 | 
			
		||||
    Countdown cmdCountdown;
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  uint32_t buildActiveCmdKey(uint16_t moduleApid, uint8_t serviceId);
 | 
			
		||||
 | 
			
		||||
  // Map for Action commands. For normal commands, a separate static structure will be used.
 | 
			
		||||
  std::map<uint32_t, ActiveCmdInfo> activeActionCmds;
 | 
			
		||||
 | 
			
		||||
  std::array<uint8_t, supv::MAX_COMMAND_SIZE> commandBuffer{};
 | 
			
		||||
  SpacePacketCreator creator;
 | 
			
		||||
  supv::TcParams spParams = supv::TcParams(creator);
 | 
			
		||||
  DeviceCommandId_t commandedByCached = MessageQueueIF::NO_QUEUE;
 | 
			
		||||
 | 
			
		||||
  ReturnValue_t parseTmPackets();
 | 
			
		||||
 | 
			
		||||
  ReturnValue_t sendCommand(DeviceCommandId_t commandId, TcBase& tc, bool replyPacketExpected,
 | 
			
		||||
                            uint32_t cmdCountdownMs = 1000);
 | 
			
		||||
  ReturnValue_t sendEmptyCmd(DeviceCommandId_t commandId, uint16_t apid, uint8_t serviceId,
 | 
			
		||||
                             bool replyPacketExpected);
 | 
			
		||||
  ReturnValue_t prepareSelBootImageCmd(const uint8_t* commandData);
 | 
			
		||||
  ReturnValue_t prepareSetTimeRefCmd();
 | 
			
		||||
  ReturnValue_t prepareSetBootTimeoutCmd(const uint8_t* commandData, size_t cmdDataLen);
 | 
			
		||||
  ReturnValue_t prepareRestartTriesCmd(const uint8_t* commandData, size_t cmdDataLen);
 | 
			
		||||
  ReturnValue_t prepareDisableHk();
 | 
			
		||||
  ReturnValue_t prepareLatchupConfigCmd(const uint8_t* commandData, DeviceCommandId_t deviceCommand,
 | 
			
		||||
                                        size_t cmdDataLen);
 | 
			
		||||
  ReturnValue_t prepareSetAlertLimitCmd(const uint8_t* commandData, size_t cmdDataLen);
 | 
			
		||||
  ReturnValue_t prepareFactoryResetCmd(const uint8_t* commandData, size_t len);
 | 
			
		||||
  ReturnValue_t prepareSetShutdownTimeoutCmd(const uint8_t* commandData, size_t cmdDataLen);
 | 
			
		||||
  ReturnValue_t prepareSetGpioCmd(const uint8_t* commandData, size_t commandDataLen);
 | 
			
		||||
  ReturnValue_t prepareReadGpioCmd(const uint8_t* commandData, size_t commandDataLen);
 | 
			
		||||
  ReturnValue_t prepareSetAdcEnabledChannelsCmd(const uint8_t* commandData);
 | 
			
		||||
  ReturnValue_t prepareSetAdcWindowAndStrideCmd(const uint8_t* commandData);
 | 
			
		||||
  ReturnValue_t prepareSetAdcThresholdCmd(const uint8_t* commandData);
 | 
			
		||||
  ReturnValue_t prepareWipeMramCmd(const uint8_t* commandData, size_t cmdDataLen);
 | 
			
		||||
  ReturnValue_t extractUpdateCommand(const uint8_t* commandData, size_t size,
 | 
			
		||||
                                     supv::UpdateParams& params);
 | 
			
		||||
  ReturnValue_t extractBaseParams(const uint8_t** commandData, size_t& remSize,
 | 
			
		||||
                                  supv::UpdateParams& params);
 | 
			
		||||
  void handleEvent(EventMessage* eventMessage);
 | 
			
		||||
 | 
			
		||||
  void handleBadApidServiceCombination(Event event, unsigned int apid, unsigned int serviceId);
 | 
			
		||||
  ReturnValue_t eventSubscription();
 | 
			
		||||
  void handlePacketPrint();
 | 
			
		||||
  bool isCommandAlreadyActive(ActionId_t actionId) const;
 | 
			
		||||
  ReturnValue_t handleAckReport(const uint8_t* data);
 | 
			
		||||
  void printAckFailureInfo(uint16_t statusCode, DeviceCommandId_t commandId);
 | 
			
		||||
  ReturnValue_t handleExecutionReport(const uint8_t* data);
 | 
			
		||||
  ReturnValue_t handleExecutionSuccessReport(ActiveCmdInfo& info, supv::ExecutionReport& report);
 | 
			
		||||
  void handleExecutionFailureReport(ActiveCmdInfo& info, supv::ExecutionReport& report);
 | 
			
		||||
  ReturnValue_t handleHkReport(const uint8_t* data);
 | 
			
		||||
  ReturnValue_t verifyPacket(const uint8_t* start, size_t foundLen);
 | 
			
		||||
  void confirmReplyPacketReceived(supv::Apid apid, uint8_t serviceId);
 | 
			
		||||
  void performCommandCompletionHandling(supv::Apid apid, uint8_t serviceId, ActiveCmdInfo& info);
 | 
			
		||||
  ReturnValue_t handleBootStatusReport(const uint8_t* data);
 | 
			
		||||
  ReturnValue_t genericHandleTm(const char* contextString, const uint8_t* data,
 | 
			
		||||
                                LocalPoolDataSetBase& set, supv::Apid apid, uint8_t serviceId);
 | 
			
		||||
  ReturnValue_t handleLatchupStatusReport(const uint8_t* data);
 | 
			
		||||
 | 
			
		||||
  bool isCommandPending() const;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif /* LINUX_PAYLOAD_FRESHSUPVHANDLER_H_ */
 | 
			
		||||
@@ -1,75 +0,0 @@
 | 
			
		||||
#include "MpsocCommunication.h"
 | 
			
		||||
 | 
			
		||||
#include "fsfw/globalfunctions/CRC.h"
 | 
			
		||||
#include "fsfw/returnvalues/returnvalue.h"
 | 
			
		||||
#include "fsfw/tmtcpacket/ccsds/SpacePacketReader.h"
 | 
			
		||||
#include "fsfw/tmtcpacket/ccsds/header.h"
 | 
			
		||||
#include "linux/payload/plocMpsocHelpers.h"
 | 
			
		||||
#include "unistd.h"
 | 
			
		||||
 | 
			
		||||
MpsocCommunication::MpsocCommunication(object_id_t objectId, SerialConfig cfg)
 | 
			
		||||
    : SystemObject(objectId), readRingBuf(4096, true), helper(cfg) {}
 | 
			
		||||
 | 
			
		||||
ReturnValue_t MpsocCommunication::initialize() { return helper.initialize(); }
 | 
			
		||||
 | 
			
		||||
ReturnValue_t MpsocCommunication::send(const uint8_t* data, size_t dataLen) {
 | 
			
		||||
  if (MPSOC_LOW_LEVEL_TX_WIRETAPPING) {
 | 
			
		||||
    sif::debug << "SEND MPSOC packet with size " << dataLen << std::endl;
 | 
			
		||||
  }
 | 
			
		||||
  return helper.send(data, dataLen);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ReturnValue_t MpsocCommunication::parseAndRetrieveNextPacket() {
 | 
			
		||||
  // We do not have a data link layer, so this whole thing is a mess in any case..
 | 
			
		||||
  // But basically, we try to parse space packets from the internal ring buffer and trasnfer
 | 
			
		||||
  // them to the higher level device handler. The CRC check is performed here as well, with
 | 
			
		||||
  // few other ways to detect if we even have a valid packet.
 | 
			
		||||
  size_t availableReadData = readRingBuf.getAvailableReadData();
 | 
			
		||||
  // Minimum valid size for a space packet header.
 | 
			
		||||
  if (availableReadData < ccsds::HEADER_LEN + 1) {
 | 
			
		||||
    return returnvalue::OK;
 | 
			
		||||
  }
 | 
			
		||||
  readRingBuf.readData(readBuf, availableReadData);
 | 
			
		||||
  spReader.setReadOnlyData(readBuf, sizeof(readBuf));
 | 
			
		||||
  auto res = spReader.checkSize();
 | 
			
		||||
  if (res != returnvalue::OK) {
 | 
			
		||||
    return res;
 | 
			
		||||
  }
 | 
			
		||||
  // The packet might be garbage, with no way to recover without a data link layer.
 | 
			
		||||
  if (spReader.getFullPacketLen() > 4096) {
 | 
			
		||||
    readRingBuf.clear();
 | 
			
		||||
    // TODO: Maybe we should also clear the serial input buffer in Linux?
 | 
			
		||||
    return FAULTY_PACKET_SIZE;
 | 
			
		||||
  }
 | 
			
		||||
  if (availableReadData < spReader.getFullPacketLen()) {
 | 
			
		||||
    // Might be split packet where the rest still has to be read.
 | 
			
		||||
    return returnvalue::OK;
 | 
			
		||||
  }
 | 
			
		||||
  if (CRC::crc16ccitt(readBuf, spReader.getFullPacketLen()) != 0) {
 | 
			
		||||
    // Possibly invalid packet. We can not even trust the detected packet length.
 | 
			
		||||
    // Just clear the whole read buffer as well.
 | 
			
		||||
    readRingBuf.clear();
 | 
			
		||||
    triggerEvent(mpsoc::CRC_FAILURE);
 | 
			
		||||
    return CRC_CHECK_FAILED;
 | 
			
		||||
  }
 | 
			
		||||
  readRingBuf.deleteData(spReader.getFullPacketLen());
 | 
			
		||||
  return PACKET_RECEIVED;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ReturnValue_t MpsocCommunication::readSerialInterface() {
 | 
			
		||||
  int bytesRead = read(helper.rawFd(), readBuf, sizeof(readBuf));
 | 
			
		||||
  if (bytesRead < 0) {
 | 
			
		||||
    return returnvalue::FAILED;
 | 
			
		||||
  }
 | 
			
		||||
  if (bytesRead > 0) {
 | 
			
		||||
    if (MPSOC_LOW_LEVEL_RX_WIRETAPPING) {
 | 
			
		||||
      sif::debug << "Read " << bytesRead << " bytes on the MPSoC interface" << std::endl;
 | 
			
		||||
    }
 | 
			
		||||
    return readRingBuf.writeData(readBuf, bytesRead);
 | 
			
		||||
  }
 | 
			
		||||
  return returnvalue::OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const SpacePacketReader& MpsocCommunication::getSpReader() const { return spReader; }
 | 
			
		||||
 | 
			
		||||
SerialCommunicationHelper& MpsocCommunication::getComHelper() { return helper; }
 | 
			
		||||
@@ -1,44 +0,0 @@
 | 
			
		||||
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include <fsfw/objectmanager/SystemObject.h>
 | 
			
		||||
 | 
			
		||||
#include "eive/resultClassIds.h"
 | 
			
		||||
#include "fsfw/container/SimpleRingBuffer.h"
 | 
			
		||||
#include "fsfw/returnvalues/returnvalue.h"
 | 
			
		||||
#include "fsfw/tmtcpacket/ccsds/SpacePacketReader.h"
 | 
			
		||||
#include "linux/payload/SerialCommunicationHelper.h"
 | 
			
		||||
 | 
			
		||||
static constexpr bool MPSOC_LOW_LEVEL_TX_WIRETAPPING = false;
 | 
			
		||||
static constexpr bool MPSOC_LOW_LEVEL_RX_WIRETAPPING = false;
 | 
			
		||||
 | 
			
		||||
class MpsocCommunication : public SystemObject {
 | 
			
		||||
 public:
 | 
			
		||||
  static const uint8_t CLASS_ID = CLASS_ID::PLOC_MPSOC_COM;
 | 
			
		||||
  static constexpr ReturnValue_t PACKET_RECEIVED = returnvalue::makeCode(CLASS_ID, 0);
 | 
			
		||||
  static constexpr ReturnValue_t FAULTY_PACKET_SIZE = returnvalue::makeCode(CLASS_ID, 1);
 | 
			
		||||
  static constexpr ReturnValue_t CRC_CHECK_FAILED = returnvalue::makeCode(CLASS_ID, 2);
 | 
			
		||||
 | 
			
		||||
  MpsocCommunication(object_id_t objectId, SerialConfig cfg);
 | 
			
		||||
  ReturnValue_t initialize() override;
 | 
			
		||||
 | 
			
		||||
  ReturnValue_t send(const uint8_t* data, size_t dataLen);
 | 
			
		||||
 | 
			
		||||
  // Should be called periodically to transfer the received data from the MPSoC from the Linux
 | 
			
		||||
  // buffer to the internal ring buffer for further processing.
 | 
			
		||||
  ReturnValue_t readSerialInterface();
 | 
			
		||||
 | 
			
		||||
  // Parses the internal ring buffer for packets and checks whether a packet was received.
 | 
			
		||||
  ReturnValue_t parseAndRetrieveNextPacket();
 | 
			
		||||
 | 
			
		||||
  // Can be used to read the parse packet, if one was received.
 | 
			
		||||
  const SpacePacketReader& getSpReader() const;
 | 
			
		||||
 | 
			
		||||
  SerialCommunicationHelper& getComHelper();
 | 
			
		||||
 | 
			
		||||
 private:
 | 
			
		||||
  SpacePacketReader spReader;
 | 
			
		||||
  uint8_t readBuf[4096];
 | 
			
		||||
  SimpleRingBuffer readRingBuf;
 | 
			
		||||
  SerialCommunicationHelper helper;
 | 
			
		||||
};
 | 
			
		||||
@@ -2,15 +2,14 @@
 | 
			
		||||
#include <linux/payload/PlocMpsocHandler.h>
 | 
			
		||||
#include <linux/payload/plocSupvDefs.h>
 | 
			
		||||
 | 
			
		||||
#include <sstream>
 | 
			
		||||
 | 
			
		||||
#include "OBSWConfig.h"
 | 
			
		||||
#include "fsfw/datapool/PoolReadGuard.h"
 | 
			
		||||
#include "fsfw/globalfunctions/CRC.h"
 | 
			
		||||
#include "fsfw/ipc/QueueFactory.h"
 | 
			
		||||
#include "fsfw/parameters/HasParametersIF.h"
 | 
			
		||||
 | 
			
		||||
PlocMpsocHandler::PlocMpsocHandler(object_id_t objectId, object_id_t uartComIFid,
 | 
			
		||||
                                   CookieIF* comCookie,
 | 
			
		||||
                                   PlocMpsocSpecialComHelperLegacy* plocMPSoCHelper,
 | 
			
		||||
                                   CookieIF* comCookie, PlocMpsocSpecialComHelper* plocMPSoCHelper,
 | 
			
		||||
                                   Gpio uartIsolatorSwitch, object_id_t supervisorHandler)
 | 
			
		||||
    : DeviceHandlerBase(objectId, uartComIFid, comCookie),
 | 
			
		||||
      hkReport(this),
 | 
			
		||||
@@ -21,8 +20,9 @@ PlocMpsocHandler::PlocMpsocHandler(object_id_t objectId, object_id_t uartComIFid
 | 
			
		||||
  if (comCookie == nullptr) {
 | 
			
		||||
    sif::error << "PlocMPSoCHandler: Invalid communication cookie" << std::endl;
 | 
			
		||||
  }
 | 
			
		||||
  eventQueue = QueueFactory::instance()->createMessageQueue(10);
 | 
			
		||||
  commandActionHelperQueue = QueueFactory::instance()->createMessageQueue(10);
 | 
			
		||||
  eventQueue = QueueFactory::instance()->createMessageQueue(EventMessage::EVENT_MESSAGE_SIZE * 5);
 | 
			
		||||
  commandActionHelperQueue =
 | 
			
		||||
      QueueFactory::instance()->createMessageQueue(EventMessage::EVENT_MESSAGE_SIZE * 5);
 | 
			
		||||
  spParams.maxSize = sizeof(commandBuffer);
 | 
			
		||||
  spParams.buf = commandBuffer;
 | 
			
		||||
}
 | 
			
		||||
@@ -54,26 +54,24 @@ ReturnValue_t PlocMpsocHandler::initialize() {
 | 
			
		||||
    return result;
 | 
			
		||||
  }
 | 
			
		||||
  result = manager->subscribeToEvent(
 | 
			
		||||
      eventQueue->getId(),
 | 
			
		||||
      event::getEventId(PlocMpsocSpecialComHelperLegacy::MPSOC_FLASH_WRITE_FAILED));
 | 
			
		||||
      eventQueue->getId(), event::getEventId(PlocMpsocSpecialComHelper::MPSOC_FLASH_WRITE_FAILED));
 | 
			
		||||
  if (result != returnvalue::OK) {
 | 
			
		||||
    return ObjectManagerIF::CHILD_INIT_FAILED;
 | 
			
		||||
  }
 | 
			
		||||
  result = manager->subscribeToEvent(
 | 
			
		||||
      eventQueue->getId(),
 | 
			
		||||
      event::getEventId(PlocMpsocSpecialComHelperLegacy::MPSOC_FLASH_WRITE_SUCCESSFUL));
 | 
			
		||||
      event::getEventId(PlocMpsocSpecialComHelper::MPSOC_FLASH_WRITE_SUCCESSFUL));
 | 
			
		||||
  if (result != returnvalue::OK) {
 | 
			
		||||
    return ObjectManagerIF::CHILD_INIT_FAILED;
 | 
			
		||||
  }
 | 
			
		||||
  result = manager->subscribeToEvent(
 | 
			
		||||
      eventQueue->getId(),
 | 
			
		||||
      event::getEventId(PlocMpsocSpecialComHelperLegacy::MPSOC_FLASH_READ_SUCCESSFUL));
 | 
			
		||||
      event::getEventId(PlocMpsocSpecialComHelper::MPSOC_FLASH_READ_SUCCESSFUL));
 | 
			
		||||
  if (result != returnvalue::OK) {
 | 
			
		||||
    return ObjectManagerIF::CHILD_INIT_FAILED;
 | 
			
		||||
  }
 | 
			
		||||
  result = manager->subscribeToEvent(
 | 
			
		||||
      eventQueue->getId(),
 | 
			
		||||
      event::getEventId(PlocMpsocSpecialComHelperLegacy::MPSOC_FLASH_READ_FAILED));
 | 
			
		||||
      eventQueue->getId(), event::getEventId(PlocMpsocSpecialComHelper::MPSOC_FLASH_READ_FAILED));
 | 
			
		||||
  if (result != returnvalue::OK) {
 | 
			
		||||
    return ObjectManagerIF::CHILD_INIT_FAILED;
 | 
			
		||||
  }
 | 
			
		||||
@@ -141,7 +139,7 @@ ReturnValue_t PlocMpsocHandler::executeAction(ActionId_t actionId, MessageQueueI
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (specialComHelperExecuting) {
 | 
			
		||||
    return mpsoc::MPSOC_HELPER_EXECUTING;
 | 
			
		||||
    return MPSoCReturnValuesIF::MPSOC_HELPER_EXECUTING;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  switch (actionId) {
 | 
			
		||||
@@ -410,7 +408,7 @@ ReturnValue_t PlocMpsocHandler::scanForReply(const uint8_t* start, size_t remain
 | 
			
		||||
      sif::debug << "PlocMPSoCHandler::scanForReply: Reply has invalid APID 0x" << std::hex
 | 
			
		||||
                 << std::setfill('0') << std::setw(2) << apid << std::dec << std::endl;
 | 
			
		||||
      *foundLen = remainingSize;
 | 
			
		||||
      return mpsoc::INVALID_APID;
 | 
			
		||||
      return MPSoCReturnValuesIF::INVALID_APID;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@@ -447,7 +445,7 @@ ReturnValue_t PlocMpsocHandler::interpretDeviceReply(DeviceCommandId_t id, const
 | 
			
		||||
    }
 | 
			
		||||
    case (mpsoc::TM_FLASH_DIRECTORY_CONTENT): {
 | 
			
		||||
      result = verifyPacket(packet, foundPacketLen);
 | 
			
		||||
      if (result == mpsoc::CRC_FAILURE) {
 | 
			
		||||
      if (result == MPSoCReturnValuesIF::CRC_FAILURE) {
 | 
			
		||||
        sif::warning << "PLOC MPSoC: Flash directory content reply invalid CRC" << std::endl;
 | 
			
		||||
      }
 | 
			
		||||
      /** Send data to commanding queue */
 | 
			
		||||
@@ -559,7 +557,7 @@ ReturnValue_t PlocMpsocHandler::prepareTcMemRead(const uint8_t* commandData,
 | 
			
		||||
ReturnValue_t PlocMpsocHandler::prepareTcFlashDelete(const uint8_t* commandData,
 | 
			
		||||
                                                     size_t commandDataLen) {
 | 
			
		||||
  if (commandDataLen > config::MAX_PATH_SIZE + config::MAX_FILENAME_SIZE) {
 | 
			
		||||
    return mpsoc::NAME_TOO_LONG;
 | 
			
		||||
    return MPSoCReturnValuesIF::NAME_TOO_LONG;
 | 
			
		||||
  }
 | 
			
		||||
  ReturnValue_t result = returnvalue::OK;
 | 
			
		||||
  mpsoc::TcFlashDelete tcFlashDelete(spParams, sequenceCount);
 | 
			
		||||
@@ -720,7 +718,7 @@ ReturnValue_t PlocMpsocHandler::finishTcPrep(mpsoc::TcBase& tcBase) {
 | 
			
		||||
 | 
			
		||||
ReturnValue_t PlocMpsocHandler::verifyPacket(const uint8_t* start, size_t foundLen) {
 | 
			
		||||
  if (CRC::crc16ccitt(start, foundLen) != 0) {
 | 
			
		||||
    return mpsoc::CRC_FAILURE;
 | 
			
		||||
    return MPSoCReturnValuesIF::CRC_FAILURE;
 | 
			
		||||
  }
 | 
			
		||||
  return returnvalue::OK;
 | 
			
		||||
}
 | 
			
		||||
@@ -729,12 +727,12 @@ ReturnValue_t PlocMpsocHandler::handleAckReport(const uint8_t* data) {
 | 
			
		||||
  ReturnValue_t result = returnvalue::OK;
 | 
			
		||||
 | 
			
		||||
  result = verifyPacket(data, mpsoc::SIZE_ACK_REPORT);
 | 
			
		||||
  if (result == mpsoc::CRC_FAILURE) {
 | 
			
		||||
  if (result == MPSoCReturnValuesIF::CRC_FAILURE) {
 | 
			
		||||
    sif::warning << "PlocMPSoCHandler::handleAckReport: CRC failure" << std::endl;
 | 
			
		||||
    nextReplyId = mpsoc::NONE;
 | 
			
		||||
    replyRawReplyIfnotWiretapped(data, mpsoc::SIZE_ACK_REPORT);
 | 
			
		||||
    triggerEvent(MPSOC_HANDLER_CRC_FAILURE);
 | 
			
		||||
    sendFailureReport(mpsoc::ACK_REPORT, mpsoc::CRC_FAILURE);
 | 
			
		||||
    sendFailureReport(mpsoc::ACK_REPORT, MPSoCReturnValuesIF::CRC_FAILURE);
 | 
			
		||||
    disableAllReplies();
 | 
			
		||||
    return IGNORE_REPLY_DATA;
 | 
			
		||||
  }
 | 
			
		||||
@@ -773,7 +771,7 @@ ReturnValue_t PlocMpsocHandler::handleExecutionReport(const uint8_t* data) {
 | 
			
		||||
  ReturnValue_t result = returnvalue::OK;
 | 
			
		||||
 | 
			
		||||
  result = verifyPacket(data, mpsoc::SIZE_EXE_REPORT);
 | 
			
		||||
  if (result == mpsoc::CRC_FAILURE) {
 | 
			
		||||
  if (result == MPSoCReturnValuesIF::CRC_FAILURE) {
 | 
			
		||||
    sif::warning << "PlocMPSoCHandler::handleExecutionReport: CRC failure" << std::endl;
 | 
			
		||||
    nextReplyId = mpsoc::NONE;
 | 
			
		||||
    return result;
 | 
			
		||||
@@ -794,9 +792,9 @@ ReturnValue_t PlocMpsocHandler::handleExecutionReport(const uint8_t* data) {
 | 
			
		||||
      uint16_t status = mpsoc::getStatusFromRawData(data);
 | 
			
		||||
      sif::warning << "MPSoC EXE Failure: " << mpsoc::getStatusString(status) << std::endl;
 | 
			
		||||
      triggerEvent(EXE_FAILURE, commandId, status);
 | 
			
		||||
      sendFailureReport(mpsoc::EXE_REPORT, mpsoc::RECEIVED_EXE_FAILURE);
 | 
			
		||||
      sendFailureReport(mpsoc::EXE_REPORT, MPSoCReturnValuesIF::RECEIVED_EXE_FAILURE);
 | 
			
		||||
      result = IGNORE_REPLY_DATA;
 | 
			
		||||
      cmdDoneHandler(false, mpsoc::RECEIVED_EXE_FAILURE);
 | 
			
		||||
      cmdDoneHandler(false, MPSoCReturnValuesIF::RECEIVED_EXE_FAILURE);
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
    default: {
 | 
			
		||||
@@ -812,7 +810,7 @@ ReturnValue_t PlocMpsocHandler::handleExecutionReport(const uint8_t* data) {
 | 
			
		||||
ReturnValue_t PlocMpsocHandler::handleMemoryReadReport(const uint8_t* data) {
 | 
			
		||||
  ReturnValue_t result = returnvalue::OK;
 | 
			
		||||
  result = verifyPacket(data, tmMemReadReport.rememberRequestedSize);
 | 
			
		||||
  if (result == mpsoc::CRC_FAILURE) {
 | 
			
		||||
  if (result == MPSoCReturnValuesIF::CRC_FAILURE) {
 | 
			
		||||
    sif::warning << "PlocMPSoCHandler::handleMemoryReadReport: Memory read report has invalid crc"
 | 
			
		||||
                 << std::endl;
 | 
			
		||||
  }
 | 
			
		||||
@@ -1000,13 +998,12 @@ ReturnValue_t PlocMpsocHandler::handleGetHkReport(const uint8_t* data) {
 | 
			
		||||
  if (result != returnvalue::OK) {
 | 
			
		||||
    return result;
 | 
			
		||||
  }
 | 
			
		||||
  hkReport.setValidity(true, true);
 | 
			
		||||
  return returnvalue::OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ReturnValue_t PlocMpsocHandler::handleCamCmdRpt(const uint8_t* data) {
 | 
			
		||||
  ReturnValue_t result = verifyPacket(data, foundPacketLen);
 | 
			
		||||
  if (result == mpsoc::CRC_FAILURE) {
 | 
			
		||||
  if (result == MPSoCReturnValuesIF::CRC_FAILURE) {
 | 
			
		||||
    sif::warning << "PlocMPSoCHandler::handleCamCmdRpt: CRC failure" << std::endl;
 | 
			
		||||
  }
 | 
			
		||||
  SpacePacketReader packetReader(data, foundPacketLen);
 | 
			
		||||
@@ -1399,18 +1396,14 @@ bool PlocMpsocHandler::handleHwStartup() {
 | 
			
		||||
  return true;
 | 
			
		||||
#endif
 | 
			
		||||
  if (powerState == PowerState::IDLE) {
 | 
			
		||||
    if (skipSupvCommandingToOn) {
 | 
			
		||||
      powerState = PowerState::DONE;
 | 
			
		||||
    if (supv::SUPV_ON) {
 | 
			
		||||
      commandActionHelper.commandAction(supervisorHandler, supv::START_MPSOC);
 | 
			
		||||
      supvTransitionCd.resetTimer();
 | 
			
		||||
      powerState = PowerState::PENDING_STARTUP;
 | 
			
		||||
    } else {
 | 
			
		||||
      if (supv::SUPV_ON) {
 | 
			
		||||
        commandActionHelper.commandAction(supervisorHandler, supv::START_MPSOC);
 | 
			
		||||
        supvTransitionCd.resetTimer();
 | 
			
		||||
        powerState = PowerState::PENDING_STARTUP;
 | 
			
		||||
      } else {
 | 
			
		||||
        triggerEvent(SUPV_NOT_ON, 1);
 | 
			
		||||
        // Set back to OFF for now, failing the transition.
 | 
			
		||||
        setMode(MODE_OFF);
 | 
			
		||||
      }
 | 
			
		||||
      triggerEvent(SUPV_NOT_ON, 1);
 | 
			
		||||
      // Set back to OFF for now, failing the transition.
 | 
			
		||||
      setMode(MODE_OFF);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  if (powerState == PowerState::SUPV_FAILED) {
 | 
			
		||||
@@ -1540,20 +1533,3 @@ ReturnValue_t PlocMpsocHandler::checkModeCommand(Mode_t commandedMode, Submode_t
 | 
			
		||||
  }
 | 
			
		||||
  return DeviceHandlerBase::checkModeCommand(commandedMode, commandedSubmode, msToReachTheMode);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ReturnValue_t PlocMpsocHandler::getParameter(uint8_t domainId, uint8_t uniqueId,
 | 
			
		||||
                                             ParameterWrapper* parameterWrapper,
 | 
			
		||||
                                             const ParameterWrapper* newValues,
 | 
			
		||||
                                             uint16_t startAtIndex) {
 | 
			
		||||
  if (uniqueId == mpsoc::ParamId::SKIP_SUPV_ON_COMMANDING) {
 | 
			
		||||
    uint8_t value = 0;
 | 
			
		||||
    newValues->getElement(&value);
 | 
			
		||||
    if (value > 1) {
 | 
			
		||||
      return HasParametersIF::INVALID_VALUE;
 | 
			
		||||
    }
 | 
			
		||||
    parameterWrapper->set(skipSupvCommandingToOn);
 | 
			
		||||
    return returnvalue::OK;
 | 
			
		||||
  }
 | 
			
		||||
  return DeviceHandlerBase::getParameter(domainId, uniqueId, parameterWrapper, newValues,
 | 
			
		||||
                                         startAtIndex);
 | 
			
		||||
}
 | 
			
		||||
@@ -1,19 +1,23 @@
 | 
			
		||||
#ifndef BSP_Q7S_DEVICES_PLOC_PLOCMPSOCHANDLER_H_
 | 
			
		||||
#define BSP_Q7S_DEVICES_PLOC_PLOCMPSOCHANDLER_H_
 | 
			
		||||
 | 
			
		||||
#include <linux/payload/PlocMpsocSpecialComHelperLegacy.h>
 | 
			
		||||
#include <linux/payload/PlocMpsocSpecialComHelper.h>
 | 
			
		||||
#include <linux/payload/mpsocRetvals.h>
 | 
			
		||||
#include <linux/payload/plocMpsocHelpers.h>
 | 
			
		||||
#include <linux/payload/plocSupvDefs.h>
 | 
			
		||||
#include <mission/controller/controllerdefinitions/PowerCtrlDefinitions.h>
 | 
			
		||||
 | 
			
		||||
#include <string>
 | 
			
		||||
 | 
			
		||||
#include "fsfw/action/CommandActionHelper.h"
 | 
			
		||||
#include "fsfw/action/CommandsActionsIF.h"
 | 
			
		||||
#include "fsfw/devicehandlers/DeviceHandlerBase.h"
 | 
			
		||||
#include "fsfw/ipc/QueueFactory.h"
 | 
			
		||||
#include "fsfw/tmtcservices/SourceSequenceCounter.h"
 | 
			
		||||
#include "fsfw_hal/linux/gpio/Gpio.h"
 | 
			
		||||
#include "fsfw_hal/linux/serial/SerialComIF.h"
 | 
			
		||||
 | 
			
		||||
static constexpr bool DEBUG_MPSOC_COMMUNICATION = true;
 | 
			
		||||
static constexpr bool DEBUG_MPSOC_COMMUNICATION = false;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @brief	This is the device handler for the MPSoC of the payload computer.
 | 
			
		||||
@@ -44,7 +48,7 @@ class PlocMpsocHandler : public DeviceHandlerBase, public CommandsActionsIF {
 | 
			
		||||
   * @param supervisorHandler   Object ID of the supervisor handler
 | 
			
		||||
   */
 | 
			
		||||
  PlocMpsocHandler(object_id_t objectId, object_id_t uartComIFid, CookieIF* comCookie,
 | 
			
		||||
                   PlocMpsocSpecialComHelperLegacy* plocMPSoCHelper, Gpio uartIsolatorSwitch,
 | 
			
		||||
                   PlocMpsocSpecialComHelper* plocMPSoCHelper, Gpio uartIsolatorSwitch,
 | 
			
		||||
                   object_id_t supervisorHandler);
 | 
			
		||||
  virtual ~PlocMpsocHandler();
 | 
			
		||||
  virtual ReturnValue_t initialize() override;
 | 
			
		||||
@@ -167,7 +171,7 @@ class PlocMpsocHandler : public DeviceHandlerBase, public CommandsActionsIF {
 | 
			
		||||
 | 
			
		||||
  SerialComIF* uartComIf = nullptr;
 | 
			
		||||
 | 
			
		||||
  PlocMpsocSpecialComHelperLegacy* specialComHelper = nullptr;
 | 
			
		||||
  PlocMpsocSpecialComHelper* specialComHelper = nullptr;
 | 
			
		||||
  Gpio uartIsolatorSwitch;
 | 
			
		||||
  object_id_t supervisorHandler = 0;
 | 
			
		||||
  CommandActionHelper commandActionHelper;
 | 
			
		||||
@@ -182,7 +186,7 @@ class PlocMpsocHandler : public DeviceHandlerBase, public CommandsActionsIF {
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  TmMemReadReport tmMemReadReport;
 | 
			
		||||
  Countdown cmdCountdown = Countdown(15000);
 | 
			
		||||
  Countdown cmdCountdown = Countdown(10000);
 | 
			
		||||
 | 
			
		||||
  struct TelemetryBuffer {
 | 
			
		||||
    uint16_t length = 0;
 | 
			
		||||
@@ -197,8 +201,6 @@ class PlocMpsocHandler : public DeviceHandlerBase, public CommandsActionsIF {
 | 
			
		||||
 | 
			
		||||
  PowerState powerState = PowerState::IDLE;
 | 
			
		||||
 | 
			
		||||
  uint8_t skipSupvCommandingToOn = false;
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @brief   Handles events received from the PLOC MPSoC helper
 | 
			
		||||
   */
 | 
			
		||||
@@ -314,9 +316,6 @@ class PlocMpsocHandler : public DeviceHandlerBase, public CommandsActionsIF {
 | 
			
		||||
  pwrctrl::EnablePl enablePl = pwrctrl::EnablePl(objects::POWER_CONTROLLER);
 | 
			
		||||
  ReturnValue_t checkModeCommand(Mode_t commandedMode, Submode_t commandedSubmode,
 | 
			
		||||
                                 uint32_t* msToReachTheMode) override;
 | 
			
		||||
 | 
			
		||||
  ReturnValue_t getParameter(uint8_t domainId, uint8_t uniqueId, ParameterWrapper* parameterWrapper,
 | 
			
		||||
                             const ParameterWrapper* newValues, uint16_t startAtIndex) override;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif /* BSP_Q7S_DEVICES_PLOC_PLOCMPSOCHANDLER_H_ */
 | 
			
		||||
@@ -6,21 +6,16 @@
 | 
			
		||||
#include <filesystem>
 | 
			
		||||
#include <fstream>
 | 
			
		||||
 | 
			
		||||
#include "fsfw/serviceinterface/ServiceInterfacePrinter.h"
 | 
			
		||||
#include "fsfw/serviceinterface/ServiceInterfaceStream.h"
 | 
			
		||||
#include "fsfw/tmtcpacket/ccsds/SpacePacketReader.h"
 | 
			
		||||
#include "linux/payload/MpsocCommunication.h"
 | 
			
		||||
#include "linux/payload/plocMpsocHelpers.h"
 | 
			
		||||
 | 
			
		||||
#ifdef XIPHOS_Q7S
 | 
			
		||||
#include "bsp_q7s/fs/FilesystemHelper.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include "mission/utility/Timestamp.h"
 | 
			
		||||
 | 
			
		||||
using namespace ploc;
 | 
			
		||||
 | 
			
		||||
PlocMpsocSpecialComHelper::PlocMpsocSpecialComHelper(object_id_t objectId,
 | 
			
		||||
                                                     MpsocCommunication& comInterface)
 | 
			
		||||
    : SystemObject(objectId), comInterface(comInterface) {
 | 
			
		||||
PlocMpsocSpecialComHelper::PlocMpsocSpecialComHelper(object_id_t objectId)
 | 
			
		||||
    : SystemObject(objectId) {
 | 
			
		||||
  spParams.buf = commandBuffer;
 | 
			
		||||
  spParams.maxSize = sizeof(commandBuffer);
 | 
			
		||||
}
 | 
			
		||||
@@ -53,9 +48,9 @@ ReturnValue_t PlocMpsocSpecialComHelper::performOperation(uint8_t operationCode)
 | 
			
		||||
      case InternalState::FLASH_WRITE: {
 | 
			
		||||
        result = performFlashWrite();
 | 
			
		||||
        if (result == returnvalue::OK) {
 | 
			
		||||
          triggerEvent(MPSOC_FLASH_WRITE_SUCCESSFUL, txSequenceCount.get());
 | 
			
		||||
          triggerEvent(MPSOC_FLASH_WRITE_SUCCESSFUL, sequenceCount->get());
 | 
			
		||||
        } else {
 | 
			
		||||
          triggerEvent(MPSOC_FLASH_WRITE_FAILED, txSequenceCount.get());
 | 
			
		||||
          triggerEvent(MPSOC_FLASH_WRITE_FAILED, sequenceCount->get());
 | 
			
		||||
        }
 | 
			
		||||
        internalState = InternalState::IDLE;
 | 
			
		||||
        break;
 | 
			
		||||
@@ -63,10 +58,9 @@ ReturnValue_t PlocMpsocSpecialComHelper::performOperation(uint8_t operationCode)
 | 
			
		||||
      case InternalState::FLASH_READ: {
 | 
			
		||||
        result = performFlashRead();
 | 
			
		||||
        if (result == returnvalue::OK) {
 | 
			
		||||
          triggerEvent(MPSOC_FLASH_READ_SUCCESSFUL, txSequenceCount.get());
 | 
			
		||||
          triggerEvent(MPSOC_FLASH_READ_SUCCESSFUL, sequenceCount->get());
 | 
			
		||||
        } else {
 | 
			
		||||
          sif::printWarning("PLOC MPSoC Helper: Flash read failed with code %04x\n", result);
 | 
			
		||||
          triggerEvent(MPSOC_FLASH_READ_FAILED, txSequenceCount.get(), result);
 | 
			
		||||
          triggerEvent(MPSOC_FLASH_READ_FAILED, sequenceCount->get());
 | 
			
		||||
        }
 | 
			
		||||
        internalState = InternalState::IDLE;
 | 
			
		||||
        break;
 | 
			
		||||
@@ -78,12 +72,19 @@ ReturnValue_t PlocMpsocSpecialComHelper::performOperation(uint8_t operationCode)
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void PlocMpsocSpecialComHelper::setCommandSequenceCount(uint16_t sequenceCount_) {
 | 
			
		||||
  txSequenceCount.set(sequenceCount_);
 | 
			
		||||
ReturnValue_t PlocMpsocSpecialComHelper::setComIF(DeviceCommunicationIF* communicationInterface_) {
 | 
			
		||||
  uartComIF = dynamic_cast<SerialComIF*>(communicationInterface_);
 | 
			
		||||
  if (uartComIF == nullptr) {
 | 
			
		||||
    sif::warning << "PlocMPSoCHelper::initialize: Invalid uart com if" << std::endl;
 | 
			
		||||
    return returnvalue::FAILED;
 | 
			
		||||
  }
 | 
			
		||||
  return returnvalue::OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
uint16_t PlocMpsocSpecialComHelper::getCommandSequenceCount() const {
 | 
			
		||||
  return txSequenceCount.get();
 | 
			
		||||
void PlocMpsocSpecialComHelper::setComCookie(CookieIF* comCookie_) { comCookie = comCookie_; }
 | 
			
		||||
 | 
			
		||||
void PlocMpsocSpecialComHelper::setSequenceCount(SourceSequenceCounter* sequenceCount_) {
 | 
			
		||||
  sequenceCount = sequenceCount_;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ReturnValue_t PlocMpsocSpecialComHelper::startFlashWrite(std::string obcFile,
 | 
			
		||||
@@ -116,8 +117,7 @@ ReturnValue_t PlocMpsocSpecialComHelper::startFlashRead(std::string obcFile, std
 | 
			
		||||
void PlocMpsocSpecialComHelper::resetHelper() {
 | 
			
		||||
  spParams.buf = commandBuffer;
 | 
			
		||||
  terminate = false;
 | 
			
		||||
  auto& helper = comInterface.getComHelper();
 | 
			
		||||
  helper.flushUartRxBuffer();
 | 
			
		||||
  uartComIF->flushUartRxBuffer(comCookie);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void PlocMpsocSpecialComHelper::stopProcess() { terminate = true; }
 | 
			
		||||
@@ -155,7 +155,7 @@ ReturnValue_t PlocMpsocSpecialComHelper::performFlashWrite() {
 | 
			
		||||
    file.read(reinterpret_cast<char*>(fileBuf.data()), dataLength);
 | 
			
		||||
    bytesRead += dataLength;
 | 
			
		||||
    remainingSize -= dataLength;
 | 
			
		||||
    mpsoc::TcFlashWrite tc(spParams, txSequenceCount);
 | 
			
		||||
    mpsoc::TcFlashWrite tc(spParams, *sequenceCount);
 | 
			
		||||
    result = tc.setPayload(fileBuf.data(), dataLength);
 | 
			
		||||
    if (result != returnvalue::OK) {
 | 
			
		||||
      return result;
 | 
			
		||||
@@ -164,7 +164,7 @@ ReturnValue_t PlocMpsocSpecialComHelper::performFlashWrite() {
 | 
			
		||||
    if (result != returnvalue::OK) {
 | 
			
		||||
      return result;
 | 
			
		||||
    }
 | 
			
		||||
    txSequenceCount.increment();
 | 
			
		||||
    (*sequenceCount)++;
 | 
			
		||||
    result = handlePacketTransmissionNoReply(tc);
 | 
			
		||||
    if (result != returnvalue::OK) {
 | 
			
		||||
      return result;
 | 
			
		||||
@@ -179,12 +179,8 @@ ReturnValue_t PlocMpsocSpecialComHelper::performFlashWrite() {
 | 
			
		||||
 | 
			
		||||
ReturnValue_t PlocMpsocSpecialComHelper::performFlashRead() {
 | 
			
		||||
  std::error_code e;
 | 
			
		||||
  if (std::filesystem::exists(flashReadAndWrite.obcFile)) {
 | 
			
		||||
    // Truncate the file first.
 | 
			
		||||
    std::ofstream ofile(flashReadAndWrite.obcFile, std::ios::binary | std::ios::trunc);
 | 
			
		||||
  }
 | 
			
		||||
  std::ofstream ofile(flashReadAndWrite.obcFile, std::ios::binary | std::ios::app);
 | 
			
		||||
  if (ofile.bad() or not ofile.is_open()) {
 | 
			
		||||
  std::ofstream ofile(flashReadAndWrite.obcFile, std::ios::trunc | std::ios::binary);
 | 
			
		||||
  if (ofile.bad()) {
 | 
			
		||||
    return returnvalue::FAILED;
 | 
			
		||||
  }
 | 
			
		||||
  ReturnValue_t result = flashfopen(mpsoc::FileAccessModes::READ);
 | 
			
		||||
@@ -207,7 +203,7 @@ ReturnValue_t PlocMpsocSpecialComHelper::performFlashRead() {
 | 
			
		||||
      std::filesystem::remove(flashReadAndWrite.obcFile, e);
 | 
			
		||||
      return FILE_READ_ERROR;
 | 
			
		||||
    }
 | 
			
		||||
    mpsoc::TcFlashRead flashReadRequest(spParams, txSequenceCount);
 | 
			
		||||
    mpsoc::TcFlashRead flashReadRequest(spParams, *sequenceCount);
 | 
			
		||||
    result = flashReadRequest.setPayload(nextReadSize);
 | 
			
		||||
    if (result != returnvalue::OK) {
 | 
			
		||||
      std::filesystem::remove(flashReadAndWrite.obcFile, e);
 | 
			
		||||
@@ -218,7 +214,7 @@ ReturnValue_t PlocMpsocSpecialComHelper::performFlashRead() {
 | 
			
		||||
      std::filesystem::remove(flashReadAndWrite.obcFile, e);
 | 
			
		||||
      return result;
 | 
			
		||||
    }
 | 
			
		||||
    txSequenceCount.increment();
 | 
			
		||||
    (*sequenceCount)++;
 | 
			
		||||
    result = handlePacketTransmissionFlashRead(flashReadRequest, ofile, nextReadSize);
 | 
			
		||||
    if (result != returnvalue::OK) {
 | 
			
		||||
      std::filesystem::remove(flashReadAndWrite.obcFile, e);
 | 
			
		||||
@@ -235,7 +231,7 @@ ReturnValue_t PlocMpsocSpecialComHelper::performFlashRead() {
 | 
			
		||||
 | 
			
		||||
ReturnValue_t PlocMpsocSpecialComHelper::flashfopen(uint8_t mode) {
 | 
			
		||||
  spParams.buf = commandBuffer;
 | 
			
		||||
  mpsoc::TcFlashFopen flashFopen(spParams, txSequenceCount);
 | 
			
		||||
  mpsoc::FlashFopen flashFopen(spParams, *sequenceCount);
 | 
			
		||||
  ReturnValue_t result = flashFopen.setPayload(flashReadAndWrite.mpsocFile, mode);
 | 
			
		||||
  if (result != returnvalue::OK) {
 | 
			
		||||
    return result;
 | 
			
		||||
@@ -244,7 +240,7 @@ ReturnValue_t PlocMpsocSpecialComHelper::flashfopen(uint8_t mode) {
 | 
			
		||||
  if (result != returnvalue::OK) {
 | 
			
		||||
    return result;
 | 
			
		||||
  }
 | 
			
		||||
  txSequenceCount.increment();
 | 
			
		||||
  (*sequenceCount)++;
 | 
			
		||||
  result = handlePacketTransmissionNoReply(flashFopen);
 | 
			
		||||
  if (result != returnvalue::OK) {
 | 
			
		||||
    return result;
 | 
			
		||||
@@ -254,12 +250,12 @@ ReturnValue_t PlocMpsocSpecialComHelper::flashfopen(uint8_t mode) {
 | 
			
		||||
 | 
			
		||||
ReturnValue_t PlocMpsocSpecialComHelper::flashfclose() {
 | 
			
		||||
  spParams.buf = commandBuffer;
 | 
			
		||||
  mpsoc::TcFlashFclose flashFclose(spParams, txSequenceCount);
 | 
			
		||||
  mpsoc::FlashFclose flashFclose(spParams, *sequenceCount);
 | 
			
		||||
  ReturnValue_t result = flashFclose.finishPacket();
 | 
			
		||||
  if (result != returnvalue::OK) {
 | 
			
		||||
    return result;
 | 
			
		||||
  }
 | 
			
		||||
  txSequenceCount.increment();
 | 
			
		||||
  (*sequenceCount)++;
 | 
			
		||||
  result = handlePacketTransmissionNoReply(flashFclose);
 | 
			
		||||
  if (result != returnvalue::OK) {
 | 
			
		||||
    return result;
 | 
			
		||||
@@ -282,7 +278,6 @@ ReturnValue_t PlocMpsocSpecialComHelper::handlePacketTransmissionFlashRead(mpsoc
 | 
			
		||||
  if (result != returnvalue::OK) {
 | 
			
		||||
    return result;
 | 
			
		||||
  }
 | 
			
		||||
  auto& spReader = comInterface.getSpReader();
 | 
			
		||||
 | 
			
		||||
  // We have the nominal case where the flash read report appears first, or the case where we
 | 
			
		||||
  // get an EXE failure immediately.
 | 
			
		||||
@@ -293,7 +288,7 @@ ReturnValue_t PlocMpsocSpecialComHelper::handlePacketTransmissionFlashRead(mpsoc
 | 
			
		||||
    }
 | 
			
		||||
    return handleExe();
 | 
			
		||||
  } else if (spReader.getApid() == mpsoc::apid::EXE_FAILURE) {
 | 
			
		||||
    handleExeFailure(spReader);
 | 
			
		||||
    handleExeFailure();
 | 
			
		||||
  } else {
 | 
			
		||||
    triggerEvent(MPSOC_EXE_INVALID_APID, spReader.getApid(), static_cast<uint32_t>(internalState));
 | 
			
		||||
    sif::warning << "PLOC MPSoC: Expected execution report "
 | 
			
		||||
@@ -316,8 +311,8 @@ ReturnValue_t PlocMpsocSpecialComHelper::handlePacketTransmissionNoReply(ploc::S
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ReturnValue_t PlocMpsocSpecialComHelper::sendCommand(ploc::SpTcBase& tc) {
 | 
			
		||||
  ReturnValue_t result = comInterface.send(tc.getFullPacket(), tc.getFullPacketLen());
 | 
			
		||||
  mpsoc::printTxPacket(tc);
 | 
			
		||||
  ReturnValue_t result = returnvalue::OK;
 | 
			
		||||
  result = uartComIF->sendMessage(comCookie, tc.getFullPacket(), tc.getFullPacketLen());
 | 
			
		||||
  if (result != returnvalue::OK) {
 | 
			
		||||
    sif::warning << "PlocMPSoCHelper::sendCommand: Failed to send command" << std::endl;
 | 
			
		||||
    triggerEvent(MPSOC_SENDING_COMMAND_FAILED, result, static_cast<uint32_t>(internalState));
 | 
			
		||||
@@ -336,8 +331,6 @@ ReturnValue_t PlocMpsocSpecialComHelper::handleAck() {
 | 
			
		||||
  if (result != returnvalue::OK) {
 | 
			
		||||
    return result;
 | 
			
		||||
  }
 | 
			
		||||
  const auto& spReader = comInterface.getSpReader();
 | 
			
		||||
 | 
			
		||||
  uint16_t apid = spReader.getApid();
 | 
			
		||||
  if (apid != mpsoc::apid::ACK_SUCCESS) {
 | 
			
		||||
    handleAckApidFailure(spReader);
 | 
			
		||||
@@ -346,7 +339,7 @@ ReturnValue_t PlocMpsocSpecialComHelper::handleAck() {
 | 
			
		||||
  return returnvalue::OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void PlocMpsocSpecialComHelper::handleAckApidFailure(const SpacePacketReader& reader) {
 | 
			
		||||
void PlocMpsocSpecialComHelper::handleAckApidFailure(const ploc::SpTmReader& reader) {
 | 
			
		||||
  uint16_t apid = reader.getApid();
 | 
			
		||||
  if (apid == mpsoc::apid::ACK_FAILURE) {
 | 
			
		||||
    uint16_t status = mpsoc::getStatusFromRawData(reader.getFullData());
 | 
			
		||||
@@ -370,10 +363,9 @@ ReturnValue_t PlocMpsocSpecialComHelper::handleExe() {
 | 
			
		||||
  if (result != returnvalue::OK) {
 | 
			
		||||
    return result;
 | 
			
		||||
  }
 | 
			
		||||
  const auto& spReader = comInterface.getSpReader();
 | 
			
		||||
  uint16_t apid = spReader.getApid();
 | 
			
		||||
  if (apid == mpsoc::apid::EXE_FAILURE) {
 | 
			
		||||
    handleExeFailure(spReader);
 | 
			
		||||
    handleExeFailure();
 | 
			
		||||
    return returnvalue::FAILED;
 | 
			
		||||
  } else if (apid != mpsoc::apid::EXE_SUCCESS) {
 | 
			
		||||
    triggerEvent(MPSOC_EXE_INVALID_APID, apid, static_cast<uint32_t>(internalState));
 | 
			
		||||
@@ -383,7 +375,7 @@ ReturnValue_t PlocMpsocSpecialComHelper::handleExe() {
 | 
			
		||||
  return returnvalue::OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void PlocMpsocSpecialComHelper::handleExeFailure(const SpacePacketReader& spReader) {
 | 
			
		||||
void PlocMpsocSpecialComHelper::handleExeFailure() {
 | 
			
		||||
  uint16_t status = mpsoc::getStatusFromRawData(spReader.getFullData());
 | 
			
		||||
  sif::warning << "PLOC MPSoC EXE Failure: " << mpsoc::getStatusString(status) << std::endl;
 | 
			
		||||
  triggerEvent(MPSOC_EXE_FAILURE_REPORT, static_cast<uint32_t>(internalState));
 | 
			
		||||
@@ -392,32 +384,46 @@ void PlocMpsocSpecialComHelper::handleExeFailure(const SpacePacketReader& spRead
 | 
			
		||||
ReturnValue_t PlocMpsocSpecialComHelper::handleTmReception() {
 | 
			
		||||
  ReturnValue_t result = returnvalue::OK;
 | 
			
		||||
  tmCountdown.resetTimer();
 | 
			
		||||
  size_t readBytes = 0;
 | 
			
		||||
  size_t currentBytes = 0;
 | 
			
		||||
  uint32_t usleepDelay = 5;
 | 
			
		||||
  size_t fullPacketLen = 0;
 | 
			
		||||
  while (true) {
 | 
			
		||||
    if (tmCountdown.hasTimedOut()) {
 | 
			
		||||
      triggerEvent(MPSOC_READ_TIMEOUT, tmCountdown.getTimeoutMs());
 | 
			
		||||
      return returnvalue::FAILED;
 | 
			
		||||
    }
 | 
			
		||||
    result = tryReceiveNextReply();
 | 
			
		||||
    if (result == MpsocCommunication::PACKET_RECEIVED) {
 | 
			
		||||
      // Need to convert this, we are faking a synchronous API here.
 | 
			
		||||
      result = returnvalue::OK;
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
    result = receive(tmBuf.data() + readBytes, 6, ¤tBytes);
 | 
			
		||||
    if (result != returnvalue::OK) {
 | 
			
		||||
      if (result == MpsocCommunication::FAULTY_PACKET_SIZE) {
 | 
			
		||||
        sif::printWarning("PLOC MPSoC Helper: retrieving next reply failed: faulty packet size\n");
 | 
			
		||||
      } else if (result == MpsocCommunication::CRC_CHECK_FAILED) {
 | 
			
		||||
        sif::printWarning("PLOC MPSoC Helper: retrieving next reply failed: CRC check failed\n");
 | 
			
		||||
      }
 | 
			
		||||
      sif::printWarning("PLOC MPSoC Helper: retrieving next reply failed with code %d\n", result);
 | 
			
		||||
      return result;
 | 
			
		||||
    }
 | 
			
		||||
    spReader.setReadOnlyData(tmBuf.data(), tmBuf.size());
 | 
			
		||||
    fullPacketLen = spReader.getFullPacketLen();
 | 
			
		||||
    readBytes += currentBytes;
 | 
			
		||||
    if (readBytes == 6) {
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
    usleep(usleepDelay);
 | 
			
		||||
    if (usleepDelay < 200000) {
 | 
			
		||||
      usleepDelay *= 4;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  while (true) {
 | 
			
		||||
    if (tmCountdown.hasTimedOut()) {
 | 
			
		||||
      triggerEvent(MPSOC_READ_TIMEOUT, tmCountdown.getTimeoutMs());
 | 
			
		||||
      return returnvalue::FAILED;
 | 
			
		||||
    }
 | 
			
		||||
    result = receive(tmBuf.data() + readBytes, fullPacketLen - readBytes, ¤tBytes);
 | 
			
		||||
    readBytes += currentBytes;
 | 
			
		||||
    if (fullPacketLen == readBytes) {
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
    usleep(usleepDelay);
 | 
			
		||||
    if (usleepDelay < 200000) {
 | 
			
		||||
      usleepDelay *= 4;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  // arrayprinter::print(tmBuf.data(), readBytes);
 | 
			
		||||
  return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -427,7 +433,6 @@ ReturnValue_t PlocMpsocSpecialComHelper::handleFlashReadReply(std::ofstream& ofi
 | 
			
		||||
  if (result != returnvalue::OK) {
 | 
			
		||||
    return result;
 | 
			
		||||
  }
 | 
			
		||||
  auto& spReader = comInterface.getSpReader();
 | 
			
		||||
  uint16_t apid = spReader.getApid();
 | 
			
		||||
  if (apid != mpsoc::apid::TM_FLASH_READ_REPORT) {
 | 
			
		||||
    triggerEvent(MPSOC_FLASH_READ_PACKET_ERROR, FlashReadErrorType::FLASH_READ_APID_ERROR);
 | 
			
		||||
@@ -493,25 +498,47 @@ ReturnValue_t PlocMpsocSpecialComHelper::startFlashReadOrWriteBase(std::string o
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ReturnValue_t PlocMpsocSpecialComHelper::checkReceivedTm() {
 | 
			
		||||
  const auto& spReader = comInterface.getSpReader();
 | 
			
		||||
  ReturnValue_t result = spReader.checkSize();
 | 
			
		||||
  if (result != returnvalue::OK) {
 | 
			
		||||
    sif::error << "PLOC MPSoC: Size check on received TM failed" << std::endl;
 | 
			
		||||
    triggerEvent(MPSOC_TM_SIZE_ERROR);
 | 
			
		||||
    return result;
 | 
			
		||||
  }
 | 
			
		||||
  rxSequenceCount = spReader.getSequenceCount();
 | 
			
		||||
  mpsoc::printRxPacket(spReader);
 | 
			
		||||
  spReader.checkCrc();
 | 
			
		||||
  if (result != returnvalue::OK) {
 | 
			
		||||
    sif::warning << "PLOC MPSoC: CRC check failed" << std::endl;
 | 
			
		||||
    triggerEvent(MPSOC_TM_CRC_MISSMATCH, *sequenceCount);
 | 
			
		||||
    return result;
 | 
			
		||||
  }
 | 
			
		||||
  uint16_t recvSeqCnt = spReader.getSequenceCount();
 | 
			
		||||
  if (recvSeqCnt != *sequenceCount) {
 | 
			
		||||
    triggerEvent(MPSOC_HELPER_SEQ_CNT_MISMATCH, *sequenceCount, recvSeqCnt);
 | 
			
		||||
    *sequenceCount = recvSeqCnt;
 | 
			
		||||
  }
 | 
			
		||||
  // This sequence count ping pong does not make any sense but it is how the MPSoC expects it.
 | 
			
		||||
  (*sequenceCount)++;
 | 
			
		||||
  return returnvalue::OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ReturnValue_t PlocMpsocSpecialComHelper::tryReceiveNextReply() {
 | 
			
		||||
ReturnValue_t PlocMpsocSpecialComHelper::receive(uint8_t* data, size_t requestBytes,
 | 
			
		||||
                                                 size_t* readBytes) {
 | 
			
		||||
  ReturnValue_t result = returnvalue::OK;
 | 
			
		||||
  result = comInterface.readSerialInterface();
 | 
			
		||||
  uint8_t* buffer = nullptr;
 | 
			
		||||
  result = uartComIF->requestReceiveMessage(comCookie, requestBytes);
 | 
			
		||||
  if (result != returnvalue::OK) {
 | 
			
		||||
    sif::warning << "PlocMPSoCHelper::receive: Failed to request reply" << std::endl;
 | 
			
		||||
    triggerEvent(MPSOC_HELPER_REQUESTING_REPLY_FAILED, result,
 | 
			
		||||
                 static_cast<uint32_t>(static_cast<uint32_t>(internalState)));
 | 
			
		||||
    return returnvalue::FAILED;
 | 
			
		||||
  }
 | 
			
		||||
  return comInterface.parseAndRetrieveNextPacket();
 | 
			
		||||
  result = uartComIF->readReceivedMessage(comCookie, &buffer, readBytes);
 | 
			
		||||
  if (result != returnvalue::OK) {
 | 
			
		||||
    sif::warning << "PlocMPSoCHelper::receive: Failed to read received message" << std::endl;
 | 
			
		||||
    triggerEvent(MPSOC_HELPER_READING_REPLY_FAILED, result, static_cast<uint32_t>(internalState));
 | 
			
		||||
    return returnvalue::FAILED;
 | 
			
		||||
  }
 | 
			
		||||
  if (*readBytes > 0) {
 | 
			
		||||
    std::memcpy(data, buffer, *readBytes);
 | 
			
		||||
  }
 | 
			
		||||
  return result;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -6,13 +6,14 @@
 | 
			
		||||
 | 
			
		||||
#include <string>
 | 
			
		||||
 | 
			
		||||
#include "OBSWConfig.h"
 | 
			
		||||
#include "fsfw/devicehandlers/CookieIF.h"
 | 
			
		||||
#include "fsfw/objectmanager/SystemObject.h"
 | 
			
		||||
#include "fsfw/osal/linux/BinarySemaphore.h"
 | 
			
		||||
#include "fsfw/returnvalues/returnvalue.h"
 | 
			
		||||
#include "fsfw/tasks/ExecutableObjectIF.h"
 | 
			
		||||
#include "fsfw/tmtcpacket/ccsds/SpacePacketReader.h"
 | 
			
		||||
#include "fsfw/tmtcservices/SourceSequenceCounter.h"
 | 
			
		||||
#include "linux/payload/MpsocCommunication.h"
 | 
			
		||||
#include "fsfw_hal/linux/serial/SerialComIF.h"
 | 
			
		||||
#ifdef XIPHOS_Q7S
 | 
			
		||||
#include "bsp_q7s/fs/SdCardManager.h"
 | 
			
		||||
#endif
 | 
			
		||||
@@ -82,12 +83,15 @@ class PlocMpsocSpecialComHelper : public SystemObject, public ExecutableObjectIF
 | 
			
		||||
    FLASH_READ_READLEN_ERROR = 2
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  PlocMpsocSpecialComHelper(object_id_t objectId, MpsocCommunication& comInterface);
 | 
			
		||||
  PlocMpsocSpecialComHelper(object_id_t objectId);
 | 
			
		||||
  virtual ~PlocMpsocSpecialComHelper();
 | 
			
		||||
 | 
			
		||||
  ReturnValue_t initialize() override;
 | 
			
		||||
  ReturnValue_t performOperation(uint8_t operationCode = 0) override;
 | 
			
		||||
 | 
			
		||||
  ReturnValue_t setComIF(DeviceCommunicationIF* communicationInterface_);
 | 
			
		||||
  void setComCookie(CookieIF* comCookie_);
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @brief   Starts flash write sequence
 | 
			
		||||
   *
 | 
			
		||||
@@ -114,8 +118,7 @@ class PlocMpsocSpecialComHelper : public SystemObject, public ExecutableObjectIF
 | 
			
		||||
  /**
 | 
			
		||||
   * @brief   Sets the sequence count object responsible for the sequence count handling
 | 
			
		||||
   */
 | 
			
		||||
  void setCommandSequenceCount(uint16_t sequenceCount_);
 | 
			
		||||
  uint16_t getCommandSequenceCount() const;
 | 
			
		||||
  void setSequenceCount(SourceSequenceCounter* sequenceCount_);
 | 
			
		||||
 | 
			
		||||
 private:
 | 
			
		||||
  static const uint8_t INTERFACE_ID = CLASS_ID::PLOC_MPSOC_HELPER;
 | 
			
		||||
@@ -166,14 +169,12 @@ class PlocMpsocSpecialComHelper : public SystemObject, public ExecutableObjectIF
 | 
			
		||||
   * Communication interface of MPSoC responsible for low level access. Must be set by the
 | 
			
		||||
   * MPSoC Handler.
 | 
			
		||||
   */
 | 
			
		||||
  // SerialComIF* uartComIF = nullptr;
 | 
			
		||||
  SerialComIF* uartComIF = nullptr;
 | 
			
		||||
  // Communication cookie. Must be set by the MPSoC Handler
 | 
			
		||||
  // CookieIF* comCookie = nullptr;
 | 
			
		||||
  MpsocCommunication& comInterface;
 | 
			
		||||
  CookieIF* comCookie = nullptr;
 | 
			
		||||
  // Sequence count, must be set by Ploc MPSoC Handler
 | 
			
		||||
  // ploc::SpTmReader spReader;
 | 
			
		||||
  uint16_t rxSequenceCount = 0;
 | 
			
		||||
  SourceSequenceCounter txSequenceCount = 0;
 | 
			
		||||
  SourceSequenceCounter* sequenceCount = nullptr;
 | 
			
		||||
  ploc::SpTmReader spReader;
 | 
			
		||||
 | 
			
		||||
  void resetHelper();
 | 
			
		||||
  ReturnValue_t performFlashWrite();
 | 
			
		||||
@@ -185,13 +186,13 @@ class PlocMpsocSpecialComHelper : public SystemObject, public ExecutableObjectIF
 | 
			
		||||
                                                  size_t expectedReadLen);
 | 
			
		||||
  ReturnValue_t handleFlashReadReply(std::ofstream& ofile, size_t expectedReadLen);
 | 
			
		||||
  ReturnValue_t sendCommand(ploc::SpTcBase& tc);
 | 
			
		||||
  ReturnValue_t tryReceiveNextReply();
 | 
			
		||||
  ReturnValue_t receive(uint8_t* data, size_t requestBytes, size_t* readBytes);
 | 
			
		||||
  ReturnValue_t handleAck();
 | 
			
		||||
  ReturnValue_t handleExe();
 | 
			
		||||
  ReturnValue_t startFlashReadOrWriteBase(std::string obcFile, std::string mpsocFile);
 | 
			
		||||
  ReturnValue_t fileCheck(std::string obcFile);
 | 
			
		||||
  void handleAckApidFailure(const SpacePacketReader& reader);
 | 
			
		||||
  void handleExeFailure(const SpacePacketReader& reader);
 | 
			
		||||
  void handleAckApidFailure(const ploc::SpTmReader& reader);
 | 
			
		||||
  void handleExeFailure();
 | 
			
		||||
  ReturnValue_t handleTmReception();
 | 
			
		||||
  ReturnValue_t checkReceivedTm();
 | 
			
		||||
};
 | 
			
		||||
 
 | 
			
		||||
@@ -19,6 +19,8 @@
 | 
			
		||||
using namespace supv;
 | 
			
		||||
using namespace returnvalue;
 | 
			
		||||
 | 
			
		||||
std::atomic_bool supv::SUPV_ON = false;
 | 
			
		||||
 | 
			
		||||
PlocSupervisorHandler::PlocSupervisorHandler(object_id_t objectId, CookieIF* comCookie,
 | 
			
		||||
                                             Gpio uartIsolatorSwitch, power::Switch_t powerSwitch,
 | 
			
		||||
                                             PlocSupvUartManager& supvHelper)
 | 
			
		||||
@@ -27,7 +29,7 @@ PlocSupervisorHandler::PlocSupervisorHandler(object_id_t objectId, CookieIF* com
 | 
			
		||||
      hkset(this),
 | 
			
		||||
      bootStatusReport(this),
 | 
			
		||||
      latchupStatusReport(this),
 | 
			
		||||
      countersReport(this),
 | 
			
		||||
      loggingReport(this),
 | 
			
		||||
      adcReport(this),
 | 
			
		||||
      powerSwitch(powerSwitch),
 | 
			
		||||
      uartManager(supvHelper) {
 | 
			
		||||
@@ -59,19 +61,6 @@ ReturnValue_t PlocSupervisorHandler::initialize() {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void PlocSupervisorHandler::performOperationHook() {
 | 
			
		||||
  if (normalCommandIsPending and normalCmdCd.hasTimedOut()) {
 | 
			
		||||
    // Event, FDIR, printout? Leads to spam though and normally should not happen..
 | 
			
		||||
    normalCommandIsPending = false;
 | 
			
		||||
  }
 | 
			
		||||
  if (commandIsPending and cmdCd.hasTimedOut()) {
 | 
			
		||||
    // Event, FDIR, printout? Leads to spam though and normally should not happen..
 | 
			
		||||
    commandIsPending = false;
 | 
			
		||||
 | 
			
		||||
    //    if(iter->second.sendReplyTo != NO_COMMANDER) {
 | 
			
		||||
    //      actionHelper.finish(true, iter->second.sendReplyTo, iter->first, returnvalue::OK);
 | 
			
		||||
    //    }
 | 
			
		||||
    disableAllReplies();
 | 
			
		||||
  }
 | 
			
		||||
  EventMessage event;
 | 
			
		||||
  for (ReturnValue_t result = eventQueue->receiveMessage(&event); result == returnvalue::OK;
 | 
			
		||||
       result = eventQueue->receiveMessage(&event)) {
 | 
			
		||||
@@ -183,16 +172,13 @@ void PlocSupervisorHandler::doShutDown() {
 | 
			
		||||
  nextReplyId = supv::NONE;
 | 
			
		||||
  uartManager.stop();
 | 
			
		||||
  uartIsolatorSwitch.pullLow();
 | 
			
		||||
  disableAllReplies();
 | 
			
		||||
  supv::SUPV_ON = false;
 | 
			
		||||
  startupState = StartupState::OFF;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ReturnValue_t PlocSupervisorHandler::buildNormalDeviceCommand(DeviceCommandId_t* id) {
 | 
			
		||||
  if (not normalCommandIsPending) {
 | 
			
		||||
  if (not commandIsExecuting(GET_HK_REPORT)) {
 | 
			
		||||
    *id = GET_HK_REPORT;
 | 
			
		||||
    normalCommandIsPending = true;
 | 
			
		||||
    normalCmdCd.resetTimer();
 | 
			
		||||
    return buildCommandFromCommand(*id, nullptr, 0);
 | 
			
		||||
  }
 | 
			
		||||
  return NOTHING_TO_SEND;
 | 
			
		||||
@@ -288,7 +274,8 @@ ReturnValue_t PlocSupervisorHandler::buildCommandFromCommand(DeviceCommandId_t d
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
    case SET_GPIO: {
 | 
			
		||||
      result = prepareSetGpioCmd(commandData, commandDataLen);
 | 
			
		||||
      prepareSetGpioCmd(commandData);
 | 
			
		||||
      result = returnvalue::OK;
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
    case FACTORY_RESET: {
 | 
			
		||||
@@ -296,7 +283,8 @@ ReturnValue_t PlocSupervisorHandler::buildCommandFromCommand(DeviceCommandId_t d
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
    case READ_GPIO: {
 | 
			
		||||
      result = prepareReadGpioCmd(commandData, commandDataLen);
 | 
			
		||||
      prepareReadGpioCmd(commandData);
 | 
			
		||||
      result = returnvalue::OK;
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
    case SET_SHUTDOWN_TIMEOUT: {
 | 
			
		||||
@@ -333,25 +321,12 @@ ReturnValue_t PlocSupervisorHandler::buildCommandFromCommand(DeviceCommandId_t d
 | 
			
		||||
      result = prepareWipeMramCmd(commandData);
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
    case REQUEST_ADC_REPORT: {
 | 
			
		||||
      prepareEmptyCmd(Apid::ADC_MON, static_cast<uint8_t>(tc::AdcMonId::REQUEST_ADC_SAMPLE));
 | 
			
		||||
      result = returnvalue::OK;
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
    case REQUEST_LOGGING_COUNTERS: {
 | 
			
		||||
      prepareEmptyCmd(Apid::DATA_LOGGER,
 | 
			
		||||
                      static_cast<uint8_t>(tc::DataLoggerServiceId::REQUEST_COUNTERS));
 | 
			
		||||
      result = returnvalue::OK;
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
    default:
 | 
			
		||||
      sif::debug << "PlocSupervisorHandler::buildCommandFromCommand: Command not implemented"
 | 
			
		||||
                 << std::endl;
 | 
			
		||||
      result = DeviceHandlerIF::COMMAND_NOT_IMPLEMENTED;
 | 
			
		||||
      break;
 | 
			
		||||
  }
 | 
			
		||||
  commandIsPending = true;
 | 
			
		||||
  cmdCd.resetTimer();
 | 
			
		||||
  return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -383,8 +358,6 @@ void PlocSupervisorHandler::fillCommandAndReplyMap() {
 | 
			
		||||
  insertInCommandMap(SET_ADC_THRESHOLD);
 | 
			
		||||
  insertInCommandMap(SET_ADC_WINDOW_AND_STRIDE);
 | 
			
		||||
  insertInCommandMap(RESET_PL);
 | 
			
		||||
  insertInCommandMap(REQUEST_ADC_REPORT);
 | 
			
		||||
  insertInCommandMap(REQUEST_LOGGING_COUNTERS);
 | 
			
		||||
 | 
			
		||||
  // ACK replies, use countdown for them
 | 
			
		||||
  insertInReplyMap(ACK_REPORT, 0, nullptr, SIZE_ACK_REPORT, false, &acknowledgementReportTimeout);
 | 
			
		||||
@@ -395,7 +368,7 @@ void PlocSupervisorHandler::fillCommandAndReplyMap() {
 | 
			
		||||
  insertInReplyMap(HK_REPORT, 3, &hkset);
 | 
			
		||||
  insertInReplyMap(BOOT_STATUS_REPORT, 3, &bootStatusReport, SIZE_BOOT_STATUS_REPORT);
 | 
			
		||||
  insertInReplyMap(LATCHUP_REPORT, 3, &latchupStatusReport, SIZE_LATCHUP_STATUS_REPORT);
 | 
			
		||||
  insertInReplyMap(COUNTERS_REPORT, 3, &countersReport, SIZE_COUNTERS_REPORT);
 | 
			
		||||
  insertInReplyMap(LOGGING_REPORT, 3, &loggingReport, SIZE_LOGGING_REPORT);
 | 
			
		||||
  insertInReplyMap(ADC_REPORT, 3, &adcReport, SIZE_ADC_REPORT);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -437,13 +410,13 @@ ReturnValue_t PlocSupervisorHandler::enableReplyInReplyMap(DeviceCommandMap::ite
 | 
			
		||||
      }
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
    case REQUEST_LOGGING_COUNTERS: {
 | 
			
		||||
    case LOGGING_REQUEST_COUNTERS: {
 | 
			
		||||
      enabledReplies = 3;
 | 
			
		||||
      result =
 | 
			
		||||
          DeviceHandlerBase::enableReplyInReplyMap(command, enabledReplies, true, COUNTERS_REPORT);
 | 
			
		||||
          DeviceHandlerBase::enableReplyInReplyMap(command, enabledReplies, true, LOGGING_REPORT);
 | 
			
		||||
      if (result != returnvalue::OK) {
 | 
			
		||||
        sif::debug << "PlocSupervisorHandler::enableReplyInReplyMap: Reply with id "
 | 
			
		||||
                   << COUNTERS_REPORT << " not in replyMap" << std::endl;
 | 
			
		||||
                   << LOGGING_REPORT << " not in replyMap" << std::endl;
 | 
			
		||||
      }
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
@@ -568,9 +541,6 @@ ReturnValue_t PlocSupervisorHandler::scanForReply(const uint8_t* start, size_t r
 | 
			
		||||
    }
 | 
			
		||||
    case (Apid::HK): {
 | 
			
		||||
      if (tmReader.getServiceId() == static_cast<uint8_t>(supv::tm::HkId::REPORT)) {
 | 
			
		||||
        normalCommandIsPending = false;
 | 
			
		||||
        // Yeah apparently this is needed??
 | 
			
		||||
        disableCommand(GET_HK_REPORT);
 | 
			
		||||
        *foundLen = tmReader.getFullPacketLen();
 | 
			
		||||
        *foundId = ReplyId::HK_REPORT;
 | 
			
		||||
        return OK;
 | 
			
		||||
@@ -589,14 +559,6 @@ ReturnValue_t PlocSupervisorHandler::scanForReply(const uint8_t* start, size_t r
 | 
			
		||||
      }
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
    case (Apid::ADC_MON): {
 | 
			
		||||
      if (tmReader.getServiceId() == static_cast<uint8_t>(supv::tm::AdcMonId::ADC_REPORT)) {
 | 
			
		||||
        *foundLen = tmReader.getFullPacketLen();
 | 
			
		||||
        *foundId = ReplyId::ADC_REPORT;
 | 
			
		||||
        return OK;
 | 
			
		||||
      }
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
    case (Apid::MEM_MAN): {
 | 
			
		||||
      if (tmReader.getServiceId() ==
 | 
			
		||||
          static_cast<uint8_t>(supv::tm::MemManId::UPDATE_STATUS_REPORT)) {
 | 
			
		||||
@@ -604,15 +566,6 @@ ReturnValue_t PlocSupervisorHandler::scanForReply(const uint8_t* start, size_t r
 | 
			
		||||
        *foundId = ReplyId::UPDATE_STATUS_REPORT;
 | 
			
		||||
        return OK;
 | 
			
		||||
      }
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
    case (Apid::DATA_LOGGER): {
 | 
			
		||||
      if (tmReader.getServiceId() ==
 | 
			
		||||
          static_cast<uint8_t>(supv::tm::DataLoggerId::COUNTERS_REPORT)) {
 | 
			
		||||
        *foundLen = tmReader.getFullPacketLen();
 | 
			
		||||
        *foundId = ReplyId::COUNTERS_REPORT;
 | 
			
		||||
        return OK;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  handleBadApidServiceCombination(SUPV_UNKNOWN_TM, apid, tmReader.getServiceId());
 | 
			
		||||
@@ -625,14 +578,6 @@ void PlocSupervisorHandler::handlePacketPrint() {
 | 
			
		||||
    if ((tmReader.getServiceId() == static_cast<uint8_t>(supv::tm::TmtcId::ACK)) or
 | 
			
		||||
        (tmReader.getServiceId() == static_cast<uint8_t>(supv::tm::TmtcId::NAK))) {
 | 
			
		||||
      AcknowledgmentReport ack(tmReader);
 | 
			
		||||
      ReturnValue_t result = ack.parse();
 | 
			
		||||
      if (result != returnvalue::OK) {
 | 
			
		||||
        sif::warning << "PlocSupervisorHandler: Parsing ACK failed" << std::endl;
 | 
			
		||||
      }
 | 
			
		||||
      if (REDUCE_NORMAL_MODE_PRINTOUT and ack.getRefModuleApid() == (uint8_t)supv::Apid::HK and
 | 
			
		||||
          ack.getRefServiceId() == (uint8_t)supv::tc::HkId::GET_REPORT) {
 | 
			
		||||
        return;
 | 
			
		||||
      }
 | 
			
		||||
      const char* printStr = "???";
 | 
			
		||||
      if (tmReader.getServiceId() == static_cast<uint8_t>(supv::tm::TmtcId::ACK)) {
 | 
			
		||||
        printStr = "ACK";
 | 
			
		||||
@@ -647,15 +592,7 @@ void PlocSupervisorHandler::handlePacketPrint() {
 | 
			
		||||
    } else if ((tmReader.getServiceId() == static_cast<uint8_t>(supv::tm::TmtcId::EXEC_ACK)) or
 | 
			
		||||
               (tmReader.getServiceId() == static_cast<uint8_t>(supv::tm::TmtcId::EXEC_NAK))) {
 | 
			
		||||
      ExecutionReport exe(tmReader);
 | 
			
		||||
      ReturnValue_t result = exe.parse();
 | 
			
		||||
      if (result != returnvalue::OK) {
 | 
			
		||||
        sif::warning << "PlocSupervisorHandler: Parsing EXE failed" << std::endl;
 | 
			
		||||
      }
 | 
			
		||||
      const char* printStr = "???";
 | 
			
		||||
      if (REDUCE_NORMAL_MODE_PRINTOUT and exe.getRefModuleApid() == (uint8_t)supv::Apid::HK and
 | 
			
		||||
          exe.getRefServiceId() == (uint8_t)supv::tc::HkId::GET_REPORT) {
 | 
			
		||||
        return;
 | 
			
		||||
      }
 | 
			
		||||
      if (tmReader.getServiceId() == static_cast<uint8_t>(supv::tm::TmtcId::EXEC_ACK)) {
 | 
			
		||||
        printStr = "ACK EXE";
 | 
			
		||||
 | 
			
		||||
@@ -690,22 +627,12 @@ ReturnValue_t PlocSupervisorHandler::interpretDeviceReply(DeviceCommandId_t id,
 | 
			
		||||
      result = handleBootStatusReport(packet);
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
    case (COUNTERS_REPORT): {
 | 
			
		||||
      result = genericHandleTm("COUNTERS", packet, countersReport);
 | 
			
		||||
#if OBSW_VERBOSE_LEVEL >= 1 && OBSW_DEBUG_PLOC_SUPERVISOR == 1
 | 
			
		||||
      countersReport.printSet();
 | 
			
		||||
#endif
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
    case (LATCHUP_REPORT): {
 | 
			
		||||
      result = handleLatchupStatusReport(packet);
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
    case (ADC_REPORT): {
 | 
			
		||||
      result = genericHandleTm("ADC", packet, adcReport);
 | 
			
		||||
#if OBSW_VERBOSE_LEVEL >= 1 && OBSW_DEBUG_PLOC_SUPERVISOR == 1
 | 
			
		||||
      adcReport.printSet();
 | 
			
		||||
#endif
 | 
			
		||||
      result = handleAdcReport(packet);
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
    case (EXE_REPORT): {
 | 
			
		||||
@@ -770,8 +697,13 @@ ReturnValue_t PlocSupervisorHandler::initializeLocalDataPool(localpool::DataPool
 | 
			
		||||
  localDataPoolMap.emplace(supv::LATCHUP_RPT_TIME_YEAR, new PoolEntry<uint8_t>({0}));
 | 
			
		||||
  localDataPoolMap.emplace(supv::LATCHUP_RPT_IS_SET, new PoolEntry<uint8_t>({0}));
 | 
			
		||||
 | 
			
		||||
  localDataPoolMap.emplace(supv::SIGNATURE, new PoolEntry<uint32_t>());
 | 
			
		||||
  localDataPoolMap.emplace(supv::LATCHUP_HAPPENED_CNTS, &latchupCounters);
 | 
			
		||||
  localDataPoolMap.emplace(supv::LATCHUP_HAPPENED_CNT_0, new PoolEntry<uint32_t>({0}));
 | 
			
		||||
  localDataPoolMap.emplace(supv::LATCHUP_HAPPENED_CNT_1, new PoolEntry<uint32_t>({0}));
 | 
			
		||||
  localDataPoolMap.emplace(supv::LATCHUP_HAPPENED_CNT_2, new PoolEntry<uint32_t>({0}));
 | 
			
		||||
  localDataPoolMap.emplace(supv::LATCHUP_HAPPENED_CNT_3, new PoolEntry<uint32_t>({0}));
 | 
			
		||||
  localDataPoolMap.emplace(supv::LATCHUP_HAPPENED_CNT_4, new PoolEntry<uint32_t>({0}));
 | 
			
		||||
  localDataPoolMap.emplace(supv::LATCHUP_HAPPENED_CNT_5, new PoolEntry<uint32_t>({0}));
 | 
			
		||||
  localDataPoolMap.emplace(supv::LATCHUP_HAPPENED_CNT_6, new PoolEntry<uint32_t>({0}));
 | 
			
		||||
  localDataPoolMap.emplace(supv::ADC_DEVIATION_TRIGGERS_CNT, new PoolEntry<uint32_t>({0}));
 | 
			
		||||
  localDataPoolMap.emplace(supv::TC_RECEIVED_CNT, new PoolEntry<uint32_t>({0}));
 | 
			
		||||
  localDataPoolMap.emplace(supv::TM_AVAILABLE_CNT, new PoolEntry<uint32_t>({0}));
 | 
			
		||||
@@ -780,22 +712,41 @@ ReturnValue_t PlocSupervisorHandler::initializeLocalDataPool(localpool::DataPool
 | 
			
		||||
  localDataPoolMap.emplace(supv::MPSOC_BOOT_FAILED_ATTEMPTS, new PoolEntry<uint32_t>({0}));
 | 
			
		||||
  localDataPoolMap.emplace(supv::MPSOC_POWER_UP, new PoolEntry<uint32_t>({0}));
 | 
			
		||||
  localDataPoolMap.emplace(supv::MPSOC_UPDATES, new PoolEntry<uint32_t>({0}));
 | 
			
		||||
  localDataPoolMap.emplace(supv::MPSOC_HEARTBEAT_RESETS, new PoolEntry<uint32_t>({0}));
 | 
			
		||||
  localDataPoolMap.emplace(supv::CPU_WDT_RESETS, new PoolEntry<uint32_t>({0}));
 | 
			
		||||
  localDataPoolMap.emplace(supv::PS_HEARTBEATS_LOST, new PoolEntry<uint32_t>({0}));
 | 
			
		||||
  localDataPoolMap.emplace(supv::PL_HEARTBEATS_LOST, new PoolEntry<uint32_t>({0}));
 | 
			
		||||
  localDataPoolMap.emplace(supv::EB_TASK_LOST, new PoolEntry<uint32_t>({0}));
 | 
			
		||||
  localDataPoolMap.emplace(supv::BM_TASK_LOST, new PoolEntry<uint32_t>({0}));
 | 
			
		||||
  localDataPoolMap.emplace(supv::LM_TASK_LOST, new PoolEntry<uint32_t>({0}));
 | 
			
		||||
  localDataPoolMap.emplace(supv::AM_TASK_LOST, new PoolEntry<uint32_t>({0}));
 | 
			
		||||
  localDataPoolMap.emplace(supv::TCTMM_TASK_LOST, new PoolEntry<uint32_t>({0}));
 | 
			
		||||
  localDataPoolMap.emplace(supv::MM_TASK_LOST, new PoolEntry<uint32_t>({0}));
 | 
			
		||||
  localDataPoolMap.emplace(supv::HK_TASK_LOST, new PoolEntry<uint32_t>({0}));
 | 
			
		||||
  localDataPoolMap.emplace(supv::DL_TASK_LOST, new PoolEntry<uint32_t>({0}));
 | 
			
		||||
  localDataPoolMap.emplace(supv::RWS_TASKS_LOST, new PoolEntry<uint32_t>(3));
 | 
			
		||||
  localDataPoolMap.emplace(supv::LAST_RECVD_TC, new PoolEntry<uint32_t>({0}));
 | 
			
		||||
 | 
			
		||||
  localDataPoolMap.emplace(supv::ADC_RAW, &adcRawEntry);
 | 
			
		||||
  localDataPoolMap.emplace(supv::ADC_ENG, &adcEngEntry);
 | 
			
		||||
  localDataPoolMap.emplace(supv::ADC_RAW_0, new PoolEntry<uint16_t>({0}));
 | 
			
		||||
  localDataPoolMap.emplace(supv::ADC_RAW_1, new PoolEntry<uint16_t>({0}));
 | 
			
		||||
  localDataPoolMap.emplace(supv::ADC_RAW_2, new PoolEntry<uint16_t>({0}));
 | 
			
		||||
  localDataPoolMap.emplace(supv::ADC_RAW_3, new PoolEntry<uint16_t>({0}));
 | 
			
		||||
  localDataPoolMap.emplace(supv::ADC_RAW_4, new PoolEntry<uint16_t>({0}));
 | 
			
		||||
  localDataPoolMap.emplace(supv::ADC_RAW_5, new PoolEntry<uint16_t>({0}));
 | 
			
		||||
  localDataPoolMap.emplace(supv::ADC_RAW_6, new PoolEntry<uint16_t>({0}));
 | 
			
		||||
  localDataPoolMap.emplace(supv::ADC_RAW_7, new PoolEntry<uint16_t>({0}));
 | 
			
		||||
  localDataPoolMap.emplace(supv::ADC_RAW_8, new PoolEntry<uint16_t>({0}));
 | 
			
		||||
  localDataPoolMap.emplace(supv::ADC_RAW_9, new PoolEntry<uint16_t>({0}));
 | 
			
		||||
  localDataPoolMap.emplace(supv::ADC_RAW_10, new PoolEntry<uint16_t>({0}));
 | 
			
		||||
  localDataPoolMap.emplace(supv::ADC_RAW_11, new PoolEntry<uint16_t>({0}));
 | 
			
		||||
  localDataPoolMap.emplace(supv::ADC_RAW_12, new PoolEntry<uint16_t>({0}));
 | 
			
		||||
  localDataPoolMap.emplace(supv::ADC_RAW_13, new PoolEntry<uint16_t>({0}));
 | 
			
		||||
  localDataPoolMap.emplace(supv::ADC_RAW_14, new PoolEntry<uint16_t>({0}));
 | 
			
		||||
  localDataPoolMap.emplace(supv::ADC_RAW_15, new PoolEntry<uint16_t>({0}));
 | 
			
		||||
 | 
			
		||||
  localDataPoolMap.emplace(supv::ADC_ENG_0, new PoolEntry<uint16_t>({0}));
 | 
			
		||||
  localDataPoolMap.emplace(supv::ADC_ENG_1, new PoolEntry<uint16_t>({0}));
 | 
			
		||||
  localDataPoolMap.emplace(supv::ADC_ENG_2, new PoolEntry<uint16_t>({0}));
 | 
			
		||||
  localDataPoolMap.emplace(supv::ADC_ENG_3, new PoolEntry<uint16_t>({0}));
 | 
			
		||||
  localDataPoolMap.emplace(supv::ADC_ENG_4, new PoolEntry<uint16_t>({0}));
 | 
			
		||||
  localDataPoolMap.emplace(supv::ADC_ENG_5, new PoolEntry<uint16_t>({0}));
 | 
			
		||||
  localDataPoolMap.emplace(supv::ADC_ENG_6, new PoolEntry<uint16_t>({0}));
 | 
			
		||||
  localDataPoolMap.emplace(supv::ADC_ENG_7, new PoolEntry<uint16_t>({0}));
 | 
			
		||||
  localDataPoolMap.emplace(supv::ADC_ENG_8, new PoolEntry<uint16_t>({0}));
 | 
			
		||||
  localDataPoolMap.emplace(supv::ADC_ENG_9, new PoolEntry<uint16_t>({0}));
 | 
			
		||||
  localDataPoolMap.emplace(supv::ADC_ENG_10, new PoolEntry<uint16_t>({0}));
 | 
			
		||||
  localDataPoolMap.emplace(supv::ADC_ENG_11, new PoolEntry<uint16_t>({0}));
 | 
			
		||||
  localDataPoolMap.emplace(supv::ADC_ENG_12, new PoolEntry<uint16_t>({0}));
 | 
			
		||||
  localDataPoolMap.emplace(supv::ADC_ENG_13, new PoolEntry<uint16_t>({0}));
 | 
			
		||||
  localDataPoolMap.emplace(supv::ADC_ENG_14, new PoolEntry<uint16_t>({0}));
 | 
			
		||||
  localDataPoolMap.emplace(supv::ADC_ENG_15, new PoolEntry<uint16_t>({0}));
 | 
			
		||||
 | 
			
		||||
  poolManager.subscribeForRegularPeriodicPacket(
 | 
			
		||||
      subdp::RegularHkPeriodicParams(hkset.getSid(), false, 10.0));
 | 
			
		||||
@@ -920,7 +871,6 @@ ReturnValue_t PlocSupervisorHandler::handleExecutionReport(const uint8_t* data)
 | 
			
		||||
  } else if (tmReader.getServiceId() == static_cast<uint8_t>(supv::tm::TmtcId::EXEC_NAK)) {
 | 
			
		||||
    handleExecutionFailureReport(report);
 | 
			
		||||
  }
 | 
			
		||||
  commandIsPending = false;
 | 
			
		||||
  nextReplyId = supv::NONE;
 | 
			
		||||
  return result;
 | 
			
		||||
}
 | 
			
		||||
@@ -1155,31 +1105,37 @@ ReturnValue_t PlocSupervisorHandler::handleLatchupStatusReport(const uint8_t* da
 | 
			
		||||
  return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ReturnValue_t PlocSupervisorHandler::genericHandleTm(const char* contextString, const uint8_t* data,
 | 
			
		||||
                                                     LocalPoolDataSetBase& set) {
 | 
			
		||||
ReturnValue_t PlocSupervisorHandler::handleAdcReport(const uint8_t* data) {
 | 
			
		||||
  ReturnValue_t result = returnvalue::OK;
 | 
			
		||||
 | 
			
		||||
  result = verifyPacket(data, tmReader.getFullPacketLen());
 | 
			
		||||
  result = verifyPacket(data, supv::SIZE_ADC_REPORT);
 | 
			
		||||
 | 
			
		||||
  if (result == result::CRC_FAILURE) {
 | 
			
		||||
    sif::warning << "PlocSupervisorHandler: " << contextString << " report has "
 | 
			
		||||
                 << "invalid CRC" << std::endl;
 | 
			
		||||
    sif::error << "PlocSupervisorHandler::handleAdcReport: ADC report has "
 | 
			
		||||
               << "invalid crc" << std::endl;
 | 
			
		||||
    return result;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  const uint8_t* dataField = data + supv::PAYLOAD_OFFSET;
 | 
			
		||||
  PoolReadGuard pg(&set);
 | 
			
		||||
  if (pg.getReadResult() != returnvalue::OK) {
 | 
			
		||||
  result = adcReport.read();
 | 
			
		||||
  if (result != returnvalue::OK) {
 | 
			
		||||
    return result;
 | 
			
		||||
  }
 | 
			
		||||
  set.setValidityBufferGeneration(false);
 | 
			
		||||
  size_t size = set.getSerializedSize();
 | 
			
		||||
  result = set.deSerialize(&dataField, &size, SerializeIF::Endianness::BIG);
 | 
			
		||||
  adcReport.setValidityBufferGeneration(false);
 | 
			
		||||
  size_t size = adcReport.getSerializedSize();
 | 
			
		||||
  result = adcReport.deSerialize(&dataField, &size, SerializeIF::Endianness::BIG);
 | 
			
		||||
  if (result != returnvalue::OK) {
 | 
			
		||||
    sif::warning << "PlocSupervisorHandler: Deserialization failed" << std::endl;
 | 
			
		||||
    sif::warning << "PlocSupervisorHandler::handleAdcReport: Deserialization failed" << std::endl;
 | 
			
		||||
  }
 | 
			
		||||
  set.setValidityBufferGeneration(true);
 | 
			
		||||
  set.setValidity(true, true);
 | 
			
		||||
  adcReport.setValidityBufferGeneration(true);
 | 
			
		||||
  adcReport.setValidity(true, true);
 | 
			
		||||
  result = adcReport.commit();
 | 
			
		||||
  if (result != returnvalue::OK) {
 | 
			
		||||
    return result;
 | 
			
		||||
  }
 | 
			
		||||
#if OBSW_VERBOSE_LEVEL >= 1 && OBSW_DEBUG_PLOC_SUPERVISOR == 1
 | 
			
		||||
  adcReport.printSet();
 | 
			
		||||
#endif
 | 
			
		||||
  nextReplyId = supv::EXE_REPORT;
 | 
			
		||||
  return result;
 | 
			
		||||
}
 | 
			
		||||
@@ -1201,8 +1157,8 @@ void PlocSupervisorHandler::setNextReplyId() {
 | 
			
		||||
    case supv::CONSECUTIVE_MRAM_DUMP:
 | 
			
		||||
      nextReplyId = supv::CONSECUTIVE_MRAM_DUMP;
 | 
			
		||||
      break;
 | 
			
		||||
    case supv::REQUEST_LOGGING_COUNTERS:
 | 
			
		||||
      nextReplyId = supv::COUNTERS_REPORT;
 | 
			
		||||
    case supv::LOGGING_REQUEST_COUNTERS:
 | 
			
		||||
      nextReplyId = supv::LOGGING_REPORT;
 | 
			
		||||
      break;
 | 
			
		||||
    case supv::REQUEST_ADC_REPORT:
 | 
			
		||||
      nextReplyId = supv::ADC_REPORT;
 | 
			
		||||
@@ -1451,11 +1407,7 @@ ReturnValue_t PlocSupervisorHandler::prepareRunAutoEmTest(const uint8_t* command
 | 
			
		||||
  return returnvalue::OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ReturnValue_t PlocSupervisorHandler::prepareSetGpioCmd(const uint8_t* commandData,
 | 
			
		||||
                                                       size_t commandDataLen) {
 | 
			
		||||
  if (commandDataLen < 3) {
 | 
			
		||||
    return HasActionsIF::INVALID_PARAMETERS;
 | 
			
		||||
  }
 | 
			
		||||
ReturnValue_t PlocSupervisorHandler::prepareSetGpioCmd(const uint8_t* commandData) {
 | 
			
		||||
  uint8_t port = *commandData;
 | 
			
		||||
  uint8_t pin = *(commandData + 1);
 | 
			
		||||
  uint8_t val = *(commandData + 2);
 | 
			
		||||
@@ -1468,11 +1420,7 @@ ReturnValue_t PlocSupervisorHandler::prepareSetGpioCmd(const uint8_t* commandDat
 | 
			
		||||
  return returnvalue::OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ReturnValue_t PlocSupervisorHandler::prepareReadGpioCmd(const uint8_t* commandData,
 | 
			
		||||
                                                        size_t commandDataLen) {
 | 
			
		||||
  if (commandDataLen < 2) {
 | 
			
		||||
    return HasActionsIF::INVALID_PARAMETERS;
 | 
			
		||||
  }
 | 
			
		||||
ReturnValue_t PlocSupervisorHandler::prepareReadGpioCmd(const uint8_t* commandData) {
 | 
			
		||||
  uint8_t port = *commandData;
 | 
			
		||||
  uint8_t pin = *(commandData + 1);
 | 
			
		||||
  supv::ReadGpio packet(spParams);
 | 
			
		||||
@@ -1518,7 +1466,6 @@ ReturnValue_t PlocSupervisorHandler::prepareSetShutdownTimeoutCmd(const uint8_t*
 | 
			
		||||
    sif::warning
 | 
			
		||||
        << "PlocSupervisorHandler::prepareSetShutdownTimeoutCmd: Failed to deserialize timeout"
 | 
			
		||||
        << std::endl;
 | 
			
		||||
    return result;
 | 
			
		||||
  }
 | 
			
		||||
  supv::SetShutdownTimeout packet(spParams);
 | 
			
		||||
  result = packet.buildPacket(timeout);
 | 
			
		||||
@@ -1570,8 +1517,8 @@ void PlocSupervisorHandler::disableAllReplies() {
 | 
			
		||||
      disableReply(LATCHUP_REPORT);
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
    case REQUEST_LOGGING_COUNTERS: {
 | 
			
		||||
      disableReply(COUNTERS_REPORT);
 | 
			
		||||
    case LOGGING_REQUEST_COUNTERS: {
 | 
			
		||||
      disableReply(LOGGING_REPORT);
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
    default: {
 | 
			
		||||
@@ -1585,9 +1532,6 @@ void PlocSupervisorHandler::disableAllReplies() {
 | 
			
		||||
 | 
			
		||||
void PlocSupervisorHandler::disableReply(DeviceCommandId_t replyId) {
 | 
			
		||||
  DeviceReplyMap::iterator iter = deviceReplyMap.find(replyId);
 | 
			
		||||
  if (iter == deviceReplyMap.end()) {
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
  DeviceReplyInfo* info = &(iter->second);
 | 
			
		||||
  info->delayCycles = 0;
 | 
			
		||||
  info->active = false;
 | 
			
		||||
@@ -1618,9 +1562,6 @@ void PlocSupervisorHandler::sendFailureReport(DeviceCommandId_t replyId, ReturnV
 | 
			
		||||
 | 
			
		||||
void PlocSupervisorHandler::disableExeReportReply() {
 | 
			
		||||
  DeviceReplyIter iter = deviceReplyMap.find(supv::EXE_REPORT);
 | 
			
		||||
  if (iter == deviceReplyMap.end()) {
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
  DeviceReplyInfo* info = &(iter->second);
 | 
			
		||||
  info->delayCycles = 0;
 | 
			
		||||
  info->command = deviceCommandMap.end();
 | 
			
		||||
@@ -1643,9 +1584,7 @@ ReturnValue_t PlocSupervisorHandler::handleMramDumpPacket(DeviceCommandId_t id)
 | 
			
		||||
    result = handleMramDumpFile(id);
 | 
			
		||||
    if (result != returnvalue::OK) {
 | 
			
		||||
      DeviceCommandMap::iterator iter = deviceCommandMap.find(id);
 | 
			
		||||
      if (iter != deviceCommandMap.end()) {
 | 
			
		||||
        actionHelper.finish(false, iter->second.sendReplyTo, id, result);
 | 
			
		||||
      }
 | 
			
		||||
      actionHelper.finish(false, iter->second.sendReplyTo, id, result);
 | 
			
		||||
      disableAllReplies();
 | 
			
		||||
      nextReplyId = supv::NONE;
 | 
			
		||||
      return result;
 | 
			
		||||
@@ -1912,12 +1851,7 @@ ReturnValue_t PlocSupervisorHandler::eventSubscription() {
 | 
			
		||||
 | 
			
		||||
ReturnValue_t PlocSupervisorHandler::handleExecutionSuccessReport(ExecutionReport& report) {
 | 
			
		||||
  DeviceCommandId_t commandId = getPendingCommand();
 | 
			
		||||
  DeviceCommandMap::iterator iter = deviceCommandMap.find(commandId);
 | 
			
		||||
  if (iter != deviceCommandMap.end() and iter->second.sendReplyTo != NO_COMMANDER) {
 | 
			
		||||
    actionHelper.finish(true, iter->second.sendReplyTo, iter->first, returnvalue::OK);
 | 
			
		||||
    iter->second.isExecuting = false;
 | 
			
		||||
  }
 | 
			
		||||
  commandIsPending = false;
 | 
			
		||||
  ReturnValue_t result = OK;
 | 
			
		||||
  switch (commandId) {
 | 
			
		||||
    case supv::READ_GPIO: {
 | 
			
		||||
      // TODO: Fix
 | 
			
		||||
@@ -1925,13 +1859,14 @@ ReturnValue_t PlocSupervisorHandler::handleExecutionSuccessReport(ExecutionRepor
 | 
			
		||||
#if OBSW_DEBUG_PLOC_SUPERVISOR == 1
 | 
			
		||||
      sif::info << "PlocSupervisorHandler: Read GPIO TM, State: " << gpioState << std::endl;
 | 
			
		||||
#endif /* OBSW_DEBUG_PLOC_SUPERVISOR == 1 */
 | 
			
		||||
      if (iter != deviceCommandMap.end() and iter->second.sendReplyTo == NO_COMMAND_ID) {
 | 
			
		||||
      DeviceCommandMap::iterator iter = deviceCommandMap.find(commandId);
 | 
			
		||||
      if (iter->second.sendReplyTo == NO_COMMAND_ID) {
 | 
			
		||||
        return returnvalue::OK;
 | 
			
		||||
      }
 | 
			
		||||
      uint8_t data[sizeof(gpioState)];
 | 
			
		||||
      size_t size = 0;
 | 
			
		||||
      ReturnValue_t result = SerializeAdapter::serialize(&gpioState, data, &size, sizeof(gpioState),
 | 
			
		||||
                                                         SerializeIF::Endianness::BIG);
 | 
			
		||||
      result = SerializeAdapter::serialize(&gpioState, data, &size, sizeof(gpioState),
 | 
			
		||||
                                           SerializeIF::Endianness::BIG);
 | 
			
		||||
      if (result != returnvalue::OK) {
 | 
			
		||||
        sif::debug << "PlocSupervisorHandler: Failed to deserialize GPIO state" << std::endl;
 | 
			
		||||
      }
 | 
			
		||||
@@ -2007,11 +1942,6 @@ uint32_t PlocSupervisorHandler::getTransitionDelayMs(Mode_t modeFrom, Mode_t mod
 | 
			
		||||
  return 7000;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void PlocSupervisorHandler::disableCommand(DeviceCommandId_t cmd) {
 | 
			
		||||
  auto commandIter = deviceCommandMap.find(GET_HK_REPORT);
 | 
			
		||||
  commandIter->second.isExecuting = false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ReturnValue_t PlocSupervisorHandler::checkModeCommand(Mode_t commandedMode,
 | 
			
		||||
                                                      Submode_t commandedSubmode,
 | 
			
		||||
                                                      uint32_t* msToReachTheMode) {
 | 
			
		||||
@@ -20,8 +20,7 @@
 | 
			
		||||
using supv::ExecutionReport;
 | 
			
		||||
using supv::TcBase;
 | 
			
		||||
 | 
			
		||||
static constexpr bool DEBUG_PLOC_SUPV = true;
 | 
			
		||||
static constexpr bool REDUCE_NORMAL_MODE_PRINTOUT = true;
 | 
			
		||||
static constexpr bool DEBUG_PLOC_SUPV = false;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @brief	This is the device handler for the supervisor of the PLOC which is programmed by
 | 
			
		||||
@@ -68,6 +67,26 @@ class PlocSupervisorHandler : public DeviceHandlerBase {
 | 
			
		||||
  void doOffActivity() override;
 | 
			
		||||
 | 
			
		||||
 private:
 | 
			
		||||
  static const uint8_t SUBSYSTEM_ID = SUBSYSTEM_ID::PLOC_SUPERVISOR_HANDLER;
 | 
			
		||||
 | 
			
		||||
  //! [EXPORT] : [COMMENT] PLOC supervisor crc failure in telemetry packet
 | 
			
		||||
  static const Event SUPV_MEMORY_READ_RPT_CRC_FAILURE = MAKE_EVENT(1, severity::LOW);
 | 
			
		||||
  //! [EXPORT] : [COMMENT] Unhandled event. P1: APID, P2: Service ID
 | 
			
		||||
  static constexpr Event SUPV_UNKNOWN_TM = MAKE_EVENT(2, severity::LOW);
 | 
			
		||||
  static constexpr Event SUPV_UNINIMPLEMENTED_TM = MAKE_EVENT(3, severity::LOW);
 | 
			
		||||
  //! [EXPORT] : [COMMENT] PLOC supervisor received acknowledgment failure report
 | 
			
		||||
  static const Event SUPV_ACK_FAILURE = MAKE_EVENT(4, severity::LOW);
 | 
			
		||||
  //! [EXPORT] : [COMMENT] PLOC received execution failure report
 | 
			
		||||
  //! P1: ID of command for which the execution failed
 | 
			
		||||
  //! P2: Status code sent by the supervisor handler
 | 
			
		||||
  static const Event SUPV_EXE_FAILURE = MAKE_EVENT(5, severity::LOW);
 | 
			
		||||
  //! [EXPORT] : [COMMENT] PLOC supervisor reply has invalid crc
 | 
			
		||||
  static const Event SUPV_CRC_FAILURE_EVENT = MAKE_EVENT(6, severity::LOW);
 | 
			
		||||
  //! [EXPORT] : [COMMENT] Supervisor helper currently executing a command
 | 
			
		||||
  static const Event SUPV_HELPER_EXECUTING = MAKE_EVENT(7, severity::LOW);
 | 
			
		||||
  //! [EXPORT] : [COMMENT] Failed to build the command to shutdown the MPSoC
 | 
			
		||||
  static const Event SUPV_MPSOC_SHUTDOWN_BUILD_FAILED = MAKE_EVENT(8, severity::LOW);
 | 
			
		||||
 | 
			
		||||
  static const uint16_t APID_MASK = 0x7FF;
 | 
			
		||||
  static const uint16_t PACKET_SEQUENCE_COUNT_MASK = 0x3FFF;
 | 
			
		||||
  static const uint8_t EXE_STATUS_OFFSET = 10;
 | 
			
		||||
@@ -75,14 +94,15 @@ class PlocSupervisorHandler : public DeviceHandlerBase {
 | 
			
		||||
  // 5 s
 | 
			
		||||
  static const uint32_t EXECUTION_DEFAULT_TIMEOUT = 5000;
 | 
			
		||||
  // 70 S
 | 
			
		||||
  static const uint32_t ACKNOWLEDGE_DEFAULT_TIMEOUT = 5000;
 | 
			
		||||
  static const uint32_t ACKNOWLEDGE_DEFAULT_TIMEOUT = 70000;
 | 
			
		||||
  // 60 s
 | 
			
		||||
  static const uint32_t MRAM_DUMP_EXECUTION_TIMEOUT = 60000;
 | 
			
		||||
  // 70 s
 | 
			
		||||
  static const uint32_t COPY_ADC_TO_MRAM_TIMEOUT = 70000;
 | 
			
		||||
  // 60 s
 | 
			
		||||
  static const uint32_t MRAM_DUMP_TIMEOUT = 60000;
 | 
			
		||||
 | 
			
		||||
  // 4 s
 | 
			
		||||
  static const uint32_t BOOT_TIMEOUT = 4000;
 | 
			
		||||
  enum class StartupState : uint8_t {
 | 
			
		||||
    OFF,
 | 
			
		||||
    BOOTING,
 | 
			
		||||
@@ -111,18 +131,11 @@ class PlocSupervisorHandler : public DeviceHandlerBase {
 | 
			
		||||
  LinuxLibgpioIF* gpioComIF = nullptr;
 | 
			
		||||
  Gpio uartIsolatorSwitch;
 | 
			
		||||
  bool shutdownCmdSent = false;
 | 
			
		||||
  // Yeah, I am using an extra variable because I once again don't know
 | 
			
		||||
  // what the hell the base class is doing and I don't care anymore.
 | 
			
		||||
  bool normalCommandIsPending = false;
 | 
			
		||||
  // True men implement their reply timeout handling themselves!
 | 
			
		||||
  Countdown normalCmdCd = Countdown(2000);
 | 
			
		||||
  bool commandIsPending = false;
 | 
			
		||||
  Countdown cmdCd = Countdown(2000);
 | 
			
		||||
 | 
			
		||||
  supv::HkSet hkset;
 | 
			
		||||
  supv::BootStatusReport bootStatusReport;
 | 
			
		||||
  supv::LatchupStatusReport latchupStatusReport;
 | 
			
		||||
  supv::CountersReport countersReport;
 | 
			
		||||
  supv::LoggingReport loggingReport;
 | 
			
		||||
  supv::AdcReport adcReport;
 | 
			
		||||
 | 
			
		||||
  const power::Switch_t powerSwitch = power::NO_SWITCH;
 | 
			
		||||
@@ -151,12 +164,9 @@ class PlocSupervisorHandler : public DeviceHandlerBase {
 | 
			
		||||
  Countdown executionReportTimeout = Countdown(EXECUTION_DEFAULT_TIMEOUT, false);
 | 
			
		||||
  Countdown acknowledgementReportTimeout = Countdown(ACKNOWLEDGE_DEFAULT_TIMEOUT, false);
 | 
			
		||||
  // Vorago nees some time to boot properly
 | 
			
		||||
  Countdown bootTimeout = Countdown(supv::BOOT_TIMEOUT_MS);
 | 
			
		||||
  Countdown bootTimeout = Countdown(BOOT_TIMEOUT);
 | 
			
		||||
  Countdown mramDumpTimeout = Countdown(MRAM_DUMP_TIMEOUT);
 | 
			
		||||
 | 
			
		||||
  PoolEntry<uint16_t> adcRawEntry = PoolEntry<uint16_t>(16);
 | 
			
		||||
  PoolEntry<uint16_t> adcEngEntry = PoolEntry<uint16_t>(16);
 | 
			
		||||
  PoolEntry<uint32_t> latchupCounters = PoolEntry<uint32_t>(7);
 | 
			
		||||
  PoolEntry<uint8_t> fmcStateEntry = PoolEntry<uint8_t>(1);
 | 
			
		||||
  PoolEntry<uint8_t> bootStateEntry = PoolEntry<uint8_t>(1);
 | 
			
		||||
  PoolEntry<uint8_t> bootCyclesEntry = PoolEntry<uint8_t>(1);
 | 
			
		||||
@@ -221,13 +231,8 @@ class PlocSupervisorHandler : public DeviceHandlerBase {
 | 
			
		||||
  ReturnValue_t handleBootStatusReport(const uint8_t* data);
 | 
			
		||||
 | 
			
		||||
  ReturnValue_t handleLatchupStatusReport(const uint8_t* data);
 | 
			
		||||
  ReturnValue_t handleCounterReport(const uint8_t* data);
 | 
			
		||||
  void handleBadApidServiceCombination(Event result, unsigned int apid, unsigned int serviceId);
 | 
			
		||||
  ReturnValue_t handleAdcReport(const uint8_t* data);
 | 
			
		||||
  ReturnValue_t genericHandleTm(const char* contextString, const uint8_t* data,
 | 
			
		||||
                                LocalPoolDataSetBase& set);
 | 
			
		||||
 | 
			
		||||
  void disableCommand(DeviceCommandId_t cmd);
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @brief   Depending on the current active command, this function sets the reply id of the
 | 
			
		||||
@@ -296,8 +301,8 @@ class PlocSupervisorHandler : public DeviceHandlerBase {
 | 
			
		||||
  ReturnValue_t prepareSetAdcThresholdCmd(const uint8_t* commandData);
 | 
			
		||||
  ReturnValue_t prepareRunAutoEmTest(const uint8_t* commandData);
 | 
			
		||||
  ReturnValue_t prepareWipeMramCmd(const uint8_t* commandData);
 | 
			
		||||
  ReturnValue_t prepareSetGpioCmd(const uint8_t* commandData, size_t commandDataLen);
 | 
			
		||||
  ReturnValue_t prepareReadGpioCmd(const uint8_t* commandData, size_t commandDataLen);
 | 
			
		||||
  ReturnValue_t prepareSetGpioCmd(const uint8_t* commandData);
 | 
			
		||||
  ReturnValue_t prepareReadGpioCmd(const uint8_t* commandData);
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @brief   Copies the content of a space packet to the command buffer.
 | 
			
		||||
@@ -11,8 +11,6 @@
 | 
			
		||||
#include <fstream>
 | 
			
		||||
 | 
			
		||||
#include "OBSWConfig.h"
 | 
			
		||||
#include "fsfw/returnvalues/returnvalue.h"
 | 
			
		||||
#include "linux/payload/plocSupvDefs.h"
 | 
			
		||||
#include "tas/hdlc.h"
 | 
			
		||||
#ifdef XIPHOS_Q7S
 | 
			
		||||
#include "bsp_q7s/fs/FilesystemHelper.h"
 | 
			
		||||
@@ -23,14 +21,9 @@
 | 
			
		||||
 | 
			
		||||
#include "fsfw/tasks/TaskFactory.h"
 | 
			
		||||
#include "fsfw/timemanager/Countdown.h"
 | 
			
		||||
 | 
			
		||||
#if OBSW_DEBUG_PLOC_SUPERVISOR == 1
 | 
			
		||||
#include "mission/utility/Filenaming.h"
 | 
			
		||||
#include "mission/utility/ProgressPrinter.h"
 | 
			
		||||
#include "mission/utility/Timestamp.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include "tas/crc.h"
 | 
			
		||||
 | 
			
		||||
using namespace returnvalue;
 | 
			
		||||
using namespace supv;
 | 
			
		||||
@@ -103,10 +96,9 @@ ReturnValue_t PlocSupvUartManager::initialize() {
 | 
			
		||||
ReturnValue_t PlocSupvUartManager::performOperation(uint8_t operationCode) {
 | 
			
		||||
  bool putTaskToSleep = false;
 | 
			
		||||
  while (true) {
 | 
			
		||||
    {
 | 
			
		||||
      MutexGuard mg(lock);
 | 
			
		||||
      state = InternalState::SLEEPING;
 | 
			
		||||
    }
 | 
			
		||||
    lock->lockMutex();
 | 
			
		||||
    state = InternalState::SLEEPING;
 | 
			
		||||
    lock->unlockMutex();
 | 
			
		||||
    semaphore->acquire();
 | 
			
		||||
    putTaskToSleep = false;
 | 
			
		||||
#if OBSW_THREAD_TRACING == 1
 | 
			
		||||
@@ -118,11 +110,9 @@ ReturnValue_t PlocSupvUartManager::performOperation(uint8_t operationCode) {
 | 
			
		||||
        break;
 | 
			
		||||
      }
 | 
			
		||||
      handleUartReception();
 | 
			
		||||
      InternalState currentState;
 | 
			
		||||
      {
 | 
			
		||||
        MutexGuard mg(lock);
 | 
			
		||||
        currentState = state;
 | 
			
		||||
      }
 | 
			
		||||
      lock->lockMutex();
 | 
			
		||||
      InternalState currentState = state;
 | 
			
		||||
      lock->unlockMutex();
 | 
			
		||||
      switch (currentState) {
 | 
			
		||||
        case InternalState::SLEEPING:
 | 
			
		||||
        case InternalState::GO_TO_SLEEP: {
 | 
			
		||||
@@ -166,7 +156,7 @@ ReturnValue_t PlocSupvUartManager::handleUartReception() {
 | 
			
		||||
               << " bytes" << std::endl;
 | 
			
		||||
    return FAILED;
 | 
			
		||||
  } else if (bytesRead > 0) {
 | 
			
		||||
    if (DEBUG_MODE) {
 | 
			
		||||
    if (debugMode) {
 | 
			
		||||
      sif::info << "Received " << bytesRead << " bytes from the PLOC Supervisor:" << std::endl;
 | 
			
		||||
      arrayprinter::print(recBuf.data(), bytesRead);
 | 
			
		||||
    }
 | 
			
		||||
@@ -283,6 +273,23 @@ ReturnValue_t PlocSupvUartManager::initiateUpdateContinuation() {
 | 
			
		||||
  return returnvalue::OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ReturnValue_t PlocSupvHelper::startEventBufferRequest(std::string path) {
 | 
			
		||||
// #ifdef XIPHOS_Q7S
 | 
			
		||||
//   ReturnValue_t result = FilesystemHelper::checkPath(path);
 | 
			
		||||
//   if (result != returnvalue::OK) {
 | 
			
		||||
//     return result;
 | 
			
		||||
//   }
 | 
			
		||||
// #endif
 | 
			
		||||
//   if (not std::filesystem::exists(path)) {
 | 
			
		||||
//     return PATH_NOT_EXISTS;
 | 
			
		||||
//   }
 | 
			
		||||
//   eventBufferReq.path = path;
 | 
			
		||||
//   request = Request::REQUEST_EVENT_BUFFER;
 | 
			
		||||
//   //uartComIF->flushUartTxAndRxBuf(comCookie);
 | 
			
		||||
//   semaphore->release();
 | 
			
		||||
//   return returnvalue::OK;
 | 
			
		||||
// }
 | 
			
		||||
 | 
			
		||||
void PlocSupvUartManager::stop() {
 | 
			
		||||
  MutexGuard mg(lock);
 | 
			
		||||
  if (state == InternalState::SLEEPING or state == InternalState::GO_TO_SLEEP) {
 | 
			
		||||
@@ -426,8 +433,6 @@ ReturnValue_t PlocSupvUartManager::writeUpdatePackets() {
 | 
			
		||||
        // Useful to allow restarting the update
 | 
			
		||||
        triggerEvent(SUPV_UPDATE_PROGRESS, buildProgParams1(progPercent, update.sequenceCount),
 | 
			
		||||
                     update.bytesWritten);
 | 
			
		||||
        sif::info << "PLOC SUPV update progress " << (int)progPercent << " % at "
 | 
			
		||||
                  << update.bytesWritten << " bytes" << std::endl;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    supv::WriteMemory packet(spParams);
 | 
			
		||||
@@ -438,8 +443,10 @@ ReturnValue_t PlocSupvUartManager::writeUpdatePackets() {
 | 
			
		||||
                   update.bytesWritten);
 | 
			
		||||
      return result;
 | 
			
		||||
    }
 | 
			
		||||
    result = writeMemoryHandlingWithRetryLogic(packet, progPercent);
 | 
			
		||||
    result = handlePacketTransmissionNoReply(packet, 5000);
 | 
			
		||||
    if (result != returnvalue::OK) {
 | 
			
		||||
      triggerEvent(WRITE_MEMORY_FAILED, buildProgParams1(progPercent, update.sequenceCount),
 | 
			
		||||
                   update.bytesWritten);
 | 
			
		||||
      return result;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -450,25 +457,7 @@ ReturnValue_t PlocSupvUartManager::writeUpdatePackets() {
 | 
			
		||||
#if OBSW_DEBUG_PLOC_SUPERVISOR == 1
 | 
			
		||||
    progressPrinter.print(update.bytesWritten);
 | 
			
		||||
#endif /* OBSW_DEBUG_PLOC_SUPERVISOR == 1 */
 | 
			
		||||
  }
 | 
			
		||||
  return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ReturnValue_t PlocSupvUartManager::writeMemoryHandlingWithRetryLogic(supv::WriteMemory& packet,
 | 
			
		||||
                                                                     unsigned progPercent) {
 | 
			
		||||
  ReturnValue_t result = returnvalue::OK;
 | 
			
		||||
  // Simple re-try logic in place to deal with communication unreliability in orbit.
 | 
			
		||||
  for (uint8_t retryCount = 0; retryCount < MAX_RETRY_COUNT; retryCount++) {
 | 
			
		||||
    result = handlePacketTransmissionNoReply(packet, COM_TIMEOUT_MS);
 | 
			
		||||
    if (result == returnvalue::OK) {
 | 
			
		||||
      return result;
 | 
			
		||||
    }
 | 
			
		||||
    triggerEvent(WRITE_MEMORY_FAILED, buildProgParams1(progPercent, update.sequenceCount),
 | 
			
		||||
                 update.bytesWritten);
 | 
			
		||||
    // Clear data structures related to reply handling.
 | 
			
		||||
    serial::flushTxRxBuf(serialPort);
 | 
			
		||||
    recRingBuf.clear();
 | 
			
		||||
    decodedRingBuf.clear();
 | 
			
		||||
    // TaskFactory::delayTask(1);
 | 
			
		||||
  }
 | 
			
		||||
  return result;
 | 
			
		||||
}
 | 
			
		||||
@@ -577,21 +566,12 @@ ReturnValue_t PlocSupvUartManager::handlePacketTransmissionNoReply(
 | 
			
		||||
  bool ackReceived = false;
 | 
			
		||||
  bool packetWasHandled = false;
 | 
			
		||||
  while (true) {
 | 
			
		||||
    ReturnValue_t status = handleUartReception();
 | 
			
		||||
    if (status != returnvalue::OK) {
 | 
			
		||||
      result = status;
 | 
			
		||||
      if (result == HDLC_ERROR) {
 | 
			
		||||
        // We could bail here immediately.. but I prefer to wait for the timeout, because we should
 | 
			
		||||
        // ensure that all packets which might be related to the transfer are still received and
 | 
			
		||||
        // cleared from all data structures related to reply handling.
 | 
			
		||||
        // return result;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    handleUartReception();
 | 
			
		||||
    if (not decodedQueue.empty()) {
 | 
			
		||||
      size_t packetLen = 0;
 | 
			
		||||
      decodedQueue.retrieve(&packetLen);
 | 
			
		||||
      decodedRingBuf.readData(decodedBuf.data(), packetLen, true);
 | 
			
		||||
      tmReader.setReadOnlyData(decodedBuf.data(), packetLen);
 | 
			
		||||
      tmReader.setData(decodedBuf.data(), packetLen);
 | 
			
		||||
      result = checkReceivedTm();
 | 
			
		||||
      if (result != returnvalue::OK) {
 | 
			
		||||
        continue;
 | 
			
		||||
@@ -629,7 +609,7 @@ ReturnValue_t PlocSupvUartManager::handlePacketTransmissionNoReply(
 | 
			
		||||
      return result::NO_REPLY_TIMEOUT;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  return result;
 | 
			
		||||
  return returnvalue::OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int PlocSupvUartManager::handleAckReception(supv::TcBase& tc, size_t packetLen) {
 | 
			
		||||
@@ -637,7 +617,7 @@ int PlocSupvUartManager::handleAckReception(supv::TcBase& tc, size_t packetLen)
 | 
			
		||||
  if (serviceId == static_cast<uint8_t>(supv::tm::TmtcId::ACK) or
 | 
			
		||||
      serviceId == static_cast<uint8_t>(supv::tm::TmtcId::NAK)) {
 | 
			
		||||
    AcknowledgmentReport ackReport(tmReader);
 | 
			
		||||
    ReturnValue_t result = ackReport.parse(false);
 | 
			
		||||
    ReturnValue_t result = ackReport.parse();
 | 
			
		||||
    if (result != returnvalue::OK) {
 | 
			
		||||
      triggerEvent(ACK_RECEPTION_FAILURE);
 | 
			
		||||
      return -1;
 | 
			
		||||
@@ -647,7 +627,7 @@ int PlocSupvUartManager::handleAckReception(supv::TcBase& tc, size_t packetLen)
 | 
			
		||||
      if (serviceId == static_cast<uint8_t>(supv::tm::TmtcId::ACK)) {
 | 
			
		||||
        return 1;
 | 
			
		||||
      } else if (serviceId == static_cast<uint8_t>(supv::tm::TmtcId::NAK)) {
 | 
			
		||||
        ackReport.printStatusInformationAck();
 | 
			
		||||
        ackReport.printStatusInformation();
 | 
			
		||||
        triggerEvent(
 | 
			
		||||
            SUPV_ACK_FAILURE_REPORT,
 | 
			
		||||
            buildApidServiceParam1(ackReport.getRefModuleApid(), ackReport.getRefServiceId()),
 | 
			
		||||
@@ -669,7 +649,7 @@ int PlocSupvUartManager::handleExeAckReception(supv::TcBase& tc, size_t packetLe
 | 
			
		||||
  if (serviceId == static_cast<uint8_t>(supv::tm::TmtcId::EXEC_ACK) or
 | 
			
		||||
      serviceId == static_cast<uint8_t>(supv::tm::TmtcId::EXEC_NAK)) {
 | 
			
		||||
    ExecutionReport exeReport(tmReader);
 | 
			
		||||
    ReturnValue_t result = exeReport.parse(false);
 | 
			
		||||
    ReturnValue_t result = exeReport.parse();
 | 
			
		||||
    if (result != returnvalue::OK) {
 | 
			
		||||
      triggerEvent(EXE_RECEPTION_FAILURE);
 | 
			
		||||
      return -1;
 | 
			
		||||
@@ -679,7 +659,7 @@ int PlocSupvUartManager::handleExeAckReception(supv::TcBase& tc, size_t packetLe
 | 
			
		||||
      if (serviceId == static_cast<uint8_t>(supv::tm::TmtcId::EXEC_ACK)) {
 | 
			
		||||
        return 1;
 | 
			
		||||
      } else if (serviceId == static_cast<uint8_t>(supv::tm::TmtcId::EXEC_NAK)) {
 | 
			
		||||
        exeReport.printStatusInformationExe();
 | 
			
		||||
        exeReport.printStatusInformation();
 | 
			
		||||
        triggerEvent(
 | 
			
		||||
            SUPV_EXE_FAILURE_REPORT,
 | 
			
		||||
            buildApidServiceParam1(exeReport.getRefModuleApid(), exeReport.getRefServiceId()),
 | 
			
		||||
@@ -702,7 +682,7 @@ ReturnValue_t PlocSupvUartManager::checkReceivedTm() {
 | 
			
		||||
    triggerEvent(SUPV_REPLY_SIZE_MISSMATCH, rememberApid);
 | 
			
		||||
    return result;
 | 
			
		||||
  }
 | 
			
		||||
  if (tmReader.checkCrc() != returnvalue::OK) {
 | 
			
		||||
  if (not tmReader.verifyCrc()) {
 | 
			
		||||
    triggerEvent(SUPV_REPLY_CRC_MISSMATCH, rememberApid);
 | 
			
		||||
    return result;
 | 
			
		||||
  }
 | 
			
		||||
@@ -778,7 +758,7 @@ ReturnValue_t PlocSupvUartManager::handleCheckMemoryCommand(uint8_t failStep) {
 | 
			
		||||
      size_t packetLen = 0;
 | 
			
		||||
      decodedQueue.retrieve(&packetLen);
 | 
			
		||||
      decodedRingBuf.readData(decodedBuf.data(), packetLen, true);
 | 
			
		||||
      tmReader.setReadOnlyData(decodedBuf.data(), packetLen);
 | 
			
		||||
      tmReader.setData(decodedBuf.data(), packetLen);
 | 
			
		||||
      result = checkReceivedTm();
 | 
			
		||||
      if (result != returnvalue::OK) {
 | 
			
		||||
        continue;
 | 
			
		||||
@@ -806,7 +786,7 @@ ReturnValue_t PlocSupvUartManager::handleCheckMemoryCommand(uint8_t failStep) {
 | 
			
		||||
      } else if (tmReader.getModuleApid() == Apid::MEM_MAN) {
 | 
			
		||||
        if (ackReceived) {
 | 
			
		||||
          supv::UpdateStatusReport report(tmReader);
 | 
			
		||||
          result = report.parse(false);
 | 
			
		||||
          result = report.parse();
 | 
			
		||||
          if (result != returnvalue::OK) {
 | 
			
		||||
            return result;
 | 
			
		||||
          }
 | 
			
		||||
@@ -961,7 +941,15 @@ ReturnValue_t PlocSupvUartManager::handleRunningLongerRequest() {
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
    case Request::REQUEST_EVENT_BUFFER: {
 | 
			
		||||
      sif::error << "Requesting event buffer is not implemented" << std::endl;
 | 
			
		||||
      //      result = performEventBufferRequest();
 | 
			
		||||
      //      if (result == returnvalue::OK) {
 | 
			
		||||
      //        triggerEvent(SUPV_EVENT_BUFFER_REQUEST_SUCCESSFUL, result);
 | 
			
		||||
      //      } else if (result == PROCESS_TERMINATED) {
 | 
			
		||||
      //        // Event already triggered
 | 
			
		||||
      //        break;
 | 
			
		||||
      //      } else {
 | 
			
		||||
      //        triggerEvent(SUPV_EVENT_BUFFER_REQUEST_FAILED, result);
 | 
			
		||||
      //      }
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
    case Request::DEFAULT: {
 | 
			
		||||
@@ -974,7 +962,7 @@ ReturnValue_t PlocSupvUartManager::handleRunningLongerRequest() {
 | 
			
		||||
ReturnValue_t PlocSupvUartManager::encodeAndSendPacket(const uint8_t* sendData, size_t sendLen) {
 | 
			
		||||
  size_t encodedLen = 0;
 | 
			
		||||
  addHdlcFraming(sendData, sendLen, encodedSendBuf.data(), &encodedLen, encodedSendBuf.size());
 | 
			
		||||
  if (PRINT_TC) {
 | 
			
		||||
  if (printTc) {
 | 
			
		||||
    sif::debug << "Sending TC" << std::endl;
 | 
			
		||||
    arrayprinter::print(encodedSendBuf.data(), encodedLen);
 | 
			
		||||
  }
 | 
			
		||||
@@ -996,9 +984,6 @@ ReturnValue_t PlocSupvUartManager::readReceivedMessage(CookieIF* cookie, uint8_t
 | 
			
		||||
    return OK;
 | 
			
		||||
  }
 | 
			
		||||
  ipcQueue.retrieve(size);
 | 
			
		||||
  if (*size > ipcBuffer.size()) {
 | 
			
		||||
    return FAILED;
 | 
			
		||||
  }
 | 
			
		||||
  *buffer = ipcBuffer.data();
 | 
			
		||||
  ReturnValue_t result = ipcRingBuf.readData(ipcBuffer.data(), *size, true);
 | 
			
		||||
  if (result != OK) {
 | 
			
		||||
@@ -1069,7 +1054,6 @@ ReturnValue_t PlocSupvUartManager::parseRecRingBufForHdlc(size_t& readSize, size
 | 
			
		||||
          triggerEvent(HDLC_CRC_ERROR);
 | 
			
		||||
        }
 | 
			
		||||
        if (retval != 0) {
 | 
			
		||||
          readSize = ++idx;
 | 
			
		||||
          return HDLC_ERROR;
 | 
			
		||||
        }
 | 
			
		||||
        return returnvalue::OK;
 | 
			
		||||
@@ -1100,14 +1084,11 @@ void PlocSupvUartManager::performUartShutdown() {
 | 
			
		||||
  while (not decodedQueue.empty()) {
 | 
			
		||||
    decodedQueue.pop();
 | 
			
		||||
  }
 | 
			
		||||
  {
 | 
			
		||||
    MutexGuard mg0(ipcLock);
 | 
			
		||||
    ipcRingBuf.clear();
 | 
			
		||||
    while (not ipcQueue.empty()) {
 | 
			
		||||
      ipcQueue.pop();
 | 
			
		||||
    }
 | 
			
		||||
  MutexGuard mg(ipcLock);
 | 
			
		||||
  ipcRingBuf.clear();
 | 
			
		||||
  while (not ipcQueue.empty()) {
 | 
			
		||||
    ipcQueue.pop();
 | 
			
		||||
  }
 | 
			
		||||
  MutexGuard mg1(lock);
 | 
			
		||||
  state = InternalState::GO_TO_SLEEP;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -16,6 +16,7 @@
 | 
			
		||||
#include "fsfw/returnvalues/returnvalue.h"
 | 
			
		||||
#include "fsfw/tasks/ExecutableObjectIF.h"
 | 
			
		||||
#include "fsfw_hal/linux/serial/SerialComIF.h"
 | 
			
		||||
#include "tas/crc.h"
 | 
			
		||||
 | 
			
		||||
#ifdef XIPHOS_Q7S
 | 
			
		||||
#include "bsp_q7s/fs/SdCardManager.h"
 | 
			
		||||
@@ -118,35 +119,8 @@ class PlocSupvUartManager : public DeviceCommunicationIF,
 | 
			
		||||
  static constexpr Event HDLC_FRAME_REMOVAL_ERROR = MAKE_EVENT(31, severity::INFO);
 | 
			
		||||
  static constexpr Event HDLC_CRC_ERROR = MAKE_EVENT(32, severity::INFO);
 | 
			
		||||
 | 
			
		||||
  static constexpr unsigned MAX_RETRY_COUNT = 3;
 | 
			
		||||
  PlocSupvUartManager(object_id_t objectId);
 | 
			
		||||
  virtual ~PlocSupvUartManager();
 | 
			
		||||
  /**
 | 
			
		||||
   * @brief Device specific initialization, using the cookie.
 | 
			
		||||
   * @details
 | 
			
		||||
   * The cookie is already prepared in the factory. If the communication
 | 
			
		||||
   * interface needs to be set up in some way and requires cookie information,
 | 
			
		||||
   * this can be performed in this function, which is called on device handler
 | 
			
		||||
   * initialization.
 | 
			
		||||
   * @param cookie
 | 
			
		||||
   * @return
 | 
			
		||||
   *  - @c returnvalue::OK if initialization was successfull
 | 
			
		||||
   *  - Everything else triggers failure event with returnvalue as parameter 1
 | 
			
		||||
   */
 | 
			
		||||
  ReturnValue_t initializeInterface(CookieIF* cookie) override;
 | 
			
		||||
  /**
 | 
			
		||||
   * Called by DHB in the SEND_WRITE doSendWrite().
 | 
			
		||||
   * This function is used to send data to the physical device
 | 
			
		||||
   * by implementing and calling related drivers or wrapper functions.
 | 
			
		||||
   * @param cookie
 | 
			
		||||
   * @param data
 | 
			
		||||
   * @param len If this is 0, nothing shall be sent.
 | 
			
		||||
   * @return
 | 
			
		||||
   *  - @c returnvalue::OK for successfull send
 | 
			
		||||
   *  - Everything else triggers failure event with returnvalue as parameter 1
 | 
			
		||||
   */
 | 
			
		||||
  ReturnValue_t sendMessage(CookieIF* cookie, const uint8_t* sendData, size_t sendLen) override;
 | 
			
		||||
  ReturnValue_t readReceivedMessage(CookieIF* cookie, uint8_t** buffer, size_t* size) override;
 | 
			
		||||
 | 
			
		||||
  ReturnValue_t initialize() override;
 | 
			
		||||
  ReturnValue_t performOperation(uint8_t operationCode = 0) override;
 | 
			
		||||
@@ -200,8 +174,6 @@ class PlocSupvUartManager : public DeviceCommunicationIF,
 | 
			
		||||
  static constexpr ReturnValue_t POSSIBLE_PACKET_LOSS_CONSECUTIVE_END = returnvalue::makeCode(1, 4);
 | 
			
		||||
  static constexpr ReturnValue_t HDLC_ERROR = returnvalue::makeCode(1, 5);
 | 
			
		||||
 | 
			
		||||
  static constexpr uint32_t COM_TIMEOUT_MS = 3000;
 | 
			
		||||
 | 
			
		||||
  static const uint16_t CRC16_INIT = 0xFFFF;
 | 
			
		||||
  // Event buffer reply will carry 24 space packets with 1016 bytes and one space packet with
 | 
			
		||||
  // 192 bytes
 | 
			
		||||
@@ -234,11 +206,11 @@ class PlocSupvUartManager : public DeviceCommunicationIF,
 | 
			
		||||
 | 
			
		||||
  struct Update update;
 | 
			
		||||
 | 
			
		||||
  int serialPort = 0;
 | 
			
		||||
  SemaphoreIF* semaphore;
 | 
			
		||||
  MutexIF* lock;
 | 
			
		||||
  MutexIF* ipcLock;
 | 
			
		||||
  supv::TmBase tmReader;
 | 
			
		||||
  int serialPort = 0;
 | 
			
		||||
  struct termios tty = {};
 | 
			
		||||
#if OBSW_THREAD_TRACING == 1
 | 
			
		||||
  uint32_t opCounter = 0;
 | 
			
		||||
@@ -285,8 +257,8 @@ class PlocSupvUartManager : public DeviceCommunicationIF,
 | 
			
		||||
 | 
			
		||||
  std::array<uint8_t, supv::MAX_COMMAND_SIZE> tmBuf{};
 | 
			
		||||
 | 
			
		||||
  static constexpr bool PRINT_TC = false;
 | 
			
		||||
  static constexpr bool DEBUG_MODE = false;
 | 
			
		||||
  bool printTc = false;
 | 
			
		||||
  bool debugMode = false;
 | 
			
		||||
  bool timestamping = true;
 | 
			
		||||
 | 
			
		||||
  // Remembers APID to know at which command a procedure failed
 | 
			
		||||
@@ -347,6 +319,32 @@ class PlocSupvUartManager : public DeviceCommunicationIF,
 | 
			
		||||
  void resetSpParams();
 | 
			
		||||
  void pushIpcData(const uint8_t* data, size_t len);
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @brief Device specific initialization, using the cookie.
 | 
			
		||||
   * @details
 | 
			
		||||
   * The cookie is already prepared in the factory. If the communication
 | 
			
		||||
   * interface needs to be set up in some way and requires cookie information,
 | 
			
		||||
   * this can be performed in this function, which is called on device handler
 | 
			
		||||
   * initialization.
 | 
			
		||||
   * @param cookie
 | 
			
		||||
   * @return
 | 
			
		||||
   *  - @c returnvalue::OK if initialization was successfull
 | 
			
		||||
   *  - Everything else triggers failure event with returnvalue as parameter 1
 | 
			
		||||
   */
 | 
			
		||||
  ReturnValue_t initializeInterface(CookieIF* cookie) override;
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Called by DHB in the SEND_WRITE doSendWrite().
 | 
			
		||||
   * This function is used to send data to the physical device
 | 
			
		||||
   * by implementing and calling related drivers or wrapper functions.
 | 
			
		||||
   * @param cookie
 | 
			
		||||
   * @param data
 | 
			
		||||
   * @param len If this is 0, nothing shall be sent.
 | 
			
		||||
   * @return
 | 
			
		||||
   *  - @c returnvalue::OK for successfull send
 | 
			
		||||
   *  - Everything else triggers failure event with returnvalue as parameter 1
 | 
			
		||||
   */
 | 
			
		||||
  ReturnValue_t sendMessage(CookieIF* cookie, const uint8_t* sendData, size_t sendLen) override;
 | 
			
		||||
  /**
 | 
			
		||||
   * Called by DHB in the GET_WRITE doGetWrite().
 | 
			
		||||
   * Get send confirmation that the data in sendMessage() was sent successfully.
 | 
			
		||||
@@ -371,8 +369,7 @@ class PlocSupvUartManager : public DeviceCommunicationIF,
 | 
			
		||||
   *           returnvalue as parameter 1
 | 
			
		||||
   */
 | 
			
		||||
  ReturnValue_t requestReceiveMessage(CookieIF* cookie, size_t requestLen) override;
 | 
			
		||||
 | 
			
		||||
  ReturnValue_t writeMemoryHandlingWithRetryLogic(supv::WriteMemory& packet, unsigned progPercent);
 | 
			
		||||
  ReturnValue_t readReceivedMessage(CookieIF* cookie, uint8_t** buffer, size_t* size) override;
 | 
			
		||||
 | 
			
		||||
  void performUartShutdown();
 | 
			
		||||
  void updateVtime(uint8_t vtime);
 | 
			
		||||
 
 | 
			
		||||
@@ -2,6 +2,6 @@
 | 
			
		||||
 | 
			
		||||
ScexDleParser::ScexDleParser(SimpleRingBuffer &decodeRingBuf, DleEncoder &decoder,
 | 
			
		||||
                             BufPair encodedBuf, BufPair decodedBuf)
 | 
			
		||||
    : DleParser(decodeRingBuf, decoder, encodedBuf, decodedBuf) {};
 | 
			
		||||
    : DleParser(decodeRingBuf, decoder, encodedBuf, decodedBuf){};
 | 
			
		||||
 | 
			
		||||
ScexDleParser::~ScexDleParser() {};
 | 
			
		||||
ScexDleParser::~ScexDleParser(){};
 | 
			
		||||
 
 | 
			
		||||
@@ -1,126 +0,0 @@
 | 
			
		||||
#include "SerialCommunicationHelper.h"
 | 
			
		||||
 | 
			
		||||
#include <errno.h>
 | 
			
		||||
#include <fcntl.h>
 | 
			
		||||
#include <termios.h>
 | 
			
		||||
#include <unistd.h>
 | 
			
		||||
 | 
			
		||||
#include <cstring>
 | 
			
		||||
 | 
			
		||||
#include "fsfw/returnvalues/returnvalue.h"
 | 
			
		||||
#include "fsfw_hal/linux/serial/helper.h"
 | 
			
		||||
 | 
			
		||||
SerialCommunicationHelper::SerialCommunicationHelper(SerialConfig cfg) : cfg(cfg) {}
 | 
			
		||||
 | 
			
		||||
ReturnValue_t SerialCommunicationHelper::initialize() {
 | 
			
		||||
  fd = configureUartPort();
 | 
			
		||||
  if (fd < 0) {
 | 
			
		||||
    return returnvalue::FAILED;
 | 
			
		||||
  }
 | 
			
		||||
  return returnvalue::OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int SerialCommunicationHelper::rawFd() const { return fd; }
 | 
			
		||||
 | 
			
		||||
ReturnValue_t SerialCommunicationHelper::send(const uint8_t* data, size_t dataLen) {
 | 
			
		||||
  if (write(fd, data, dataLen) != static_cast<int>(dataLen)) {
 | 
			
		||||
#if FSFW_CPP_OSTREAM_ENABLED == 1
 | 
			
		||||
    sif::error << "UartComIF::sendMessage: Failed to send data with error code " << errno
 | 
			
		||||
               << ": Error description: " << strerror(errno) << std::endl;
 | 
			
		||||
#endif
 | 
			
		||||
    return returnvalue::FAILED;
 | 
			
		||||
  }
 | 
			
		||||
  return returnvalue::OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int SerialCommunicationHelper::configureUartPort() {
 | 
			
		||||
  struct termios options = {};
 | 
			
		||||
 | 
			
		||||
  int flags = O_RDWR;
 | 
			
		||||
  if (cfg.getUartMode() == UartModes::CANONICAL) {
 | 
			
		||||
    // In non-canonical mode, don't specify O_NONBLOCK because these properties will be
 | 
			
		||||
    // controlled by the VTIME and VMIN parameters and O_NONBLOCK would override this
 | 
			
		||||
    flags |= O_NONBLOCK;
 | 
			
		||||
  }
 | 
			
		||||
  int fd = open(cfg.getDeviceFile().c_str(), flags);
 | 
			
		||||
 | 
			
		||||
  if (fd < 0) {
 | 
			
		||||
#if FSFW_CPP_OSTREAM_ENABLED == 1
 | 
			
		||||
    sif::warning << "UartComIF::configureUartPort: Failed to open uart "
 | 
			
		||||
                 << cfg.getDeviceFile().c_str()
 | 
			
		||||
 | 
			
		||||
                 << "with error code " << errno << strerror(errno) << std::endl;
 | 
			
		||||
#endif
 | 
			
		||||
    return fd;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* Read in existing settings */
 | 
			
		||||
  if (tcgetattr(fd, &options) != 0) {
 | 
			
		||||
#if FSFW_CPP_OSTREAM_ENABLED == 1
 | 
			
		||||
    sif::warning << "UartComIF::configureUartPort: Error " << errno
 | 
			
		||||
                 << "from tcgetattr: " << strerror(errno) << std::endl;
 | 
			
		||||
#endif
 | 
			
		||||
    return fd;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  serial::setParity(options, cfg.getParity());
 | 
			
		||||
  serial::setStopbits(options, cfg.getStopBits());
 | 
			
		||||
  serial::setBitsPerWord(options, cfg.getBitsPerWord());
 | 
			
		||||
  setFixedOptions(&options);
 | 
			
		||||
  serial::setMode(options, cfg.getUartMode());
 | 
			
		||||
  tcflush(fd, TCIFLUSH);
 | 
			
		||||
 | 
			
		||||
  /* Sets uart to non-blocking mode. Read returns immediately when there are no data available */
 | 
			
		||||
  options.c_cc[VTIME] = 0;
 | 
			
		||||
  options.c_cc[VMIN] = 0;
 | 
			
		||||
 | 
			
		||||
  serial::setBaudrate(options, cfg.getBaudrate());
 | 
			
		||||
 | 
			
		||||
  /* Save option settings */
 | 
			
		||||
  if (tcsetattr(fd, TCSANOW, &options) != 0) {
 | 
			
		||||
#if FSFW_CPP_OSTREAM_ENABLED == 1
 | 
			
		||||
    sif::warning << "UartComIF::configureUartPort: Failed to set options with error " << errno
 | 
			
		||||
                 << ": " << strerror(errno);
 | 
			
		||||
#endif
 | 
			
		||||
    return fd;
 | 
			
		||||
  }
 | 
			
		||||
  return fd;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void SerialCommunicationHelper::setFixedOptions(struct termios* options) {
 | 
			
		||||
  /* Disable RTS/CTS hardware flow control */
 | 
			
		||||
  options->c_cflag &= ~CRTSCTS;
 | 
			
		||||
  /* Turn on READ & ignore ctrl lines (CLOCAL = 1) */
 | 
			
		||||
  options->c_cflag |= CREAD | CLOCAL;
 | 
			
		||||
  /* Disable echo */
 | 
			
		||||
  options->c_lflag &= ~ECHO;
 | 
			
		||||
  /* Disable erasure */
 | 
			
		||||
  options->c_lflag &= ~ECHOE;
 | 
			
		||||
  /* Disable new-line echo */
 | 
			
		||||
  options->c_lflag &= ~ECHONL;
 | 
			
		||||
  /* Disable interpretation of INTR, QUIT and SUSP */
 | 
			
		||||
  options->c_lflag &= ~ISIG;
 | 
			
		||||
  /* Turn off s/w flow ctrl */
 | 
			
		||||
  options->c_iflag &= ~(IXON | IXOFF | IXANY);
 | 
			
		||||
  /* Disable any special handling of received bytes */
 | 
			
		||||
  options->c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR | IGNCR | ICRNL);
 | 
			
		||||
  /* Prevent special interpretation of output bytes (e.g. newline chars) */
 | 
			
		||||
  options->c_oflag &= ~OPOST;
 | 
			
		||||
  /* Prevent conversion of newline to carriage return/line feed */
 | 
			
		||||
  options->c_oflag &= ~ONLCR;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ReturnValue_t SerialCommunicationHelper::flushUartRxBuffer() {
 | 
			
		||||
  serial::flushRxBuf(fd);
 | 
			
		||||
  return returnvalue::OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ReturnValue_t SerialCommunicationHelper::flushUartTxBuffer() {
 | 
			
		||||
  serial::flushTxBuf(fd);
 | 
			
		||||
  return returnvalue::OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ReturnValue_t SerialCommunicationHelper::flushUartTxAndRxBuf() {
 | 
			
		||||
  serial::flushTxRxBuf(fd);
 | 
			
		||||
  return returnvalue::OK;
 | 
			
		||||
}
 | 
			
		||||
@@ -1,69 +0,0 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include <fsfw/devicehandlers/DeviceCommunicationIF.h>
 | 
			
		||||
#include <fsfw/objectmanager/SystemObject.h>
 | 
			
		||||
#include <fsfw_hal/linux/serial/SerialCookie.h>
 | 
			
		||||
#include <fsfw_hal/linux/serial/helper.h>
 | 
			
		||||
 | 
			
		||||
#include "SerialConfig.h"
 | 
			
		||||
#include "fsfw/returnvalues/returnvalue.h"
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @brief 	This is the communication interface to access serial ports on linux based operating
 | 
			
		||||
 *          systems.
 | 
			
		||||
 *
 | 
			
		||||
 * @details The implementation follows the instructions from https://blog.mbedded.ninja/programming/
 | 
			
		||||
 *          operating-systems/linux/linux-serial-ports-using-c-cpp/#disabling-canonical-mode
 | 
			
		||||
 *
 | 
			
		||||
 * @author 	J. Meier
 | 
			
		||||
 */
 | 
			
		||||
class SerialCommunicationHelper {
 | 
			
		||||
 public:
 | 
			
		||||
  SerialCommunicationHelper(SerialConfig serialCfg);
 | 
			
		||||
 | 
			
		||||
  ReturnValue_t send(const uint8_t* data, size_t dataLen);
 | 
			
		||||
 | 
			
		||||
  int rawFd() const;
 | 
			
		||||
 | 
			
		||||
  ReturnValue_t initialize();
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @brief   This function discards all data received but not read in the UART buffer.
 | 
			
		||||
   */
 | 
			
		||||
  ReturnValue_t flushUartRxBuffer();
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @brief   This function discards all data in the transmit buffer of the UART driver.
 | 
			
		||||
   */
 | 
			
		||||
  ReturnValue_t flushUartTxBuffer();
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @brief   This function discards both data in the transmit and receive buffer of the UART.
 | 
			
		||||
   */
 | 
			
		||||
  ReturnValue_t flushUartTxAndRxBuf();
 | 
			
		||||
 | 
			
		||||
 private:
 | 
			
		||||
  SerialConfig cfg;
 | 
			
		||||
  int fd = 0;
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @brief	This function opens and configures a uart device by using the information stored
 | 
			
		||||
   *          in the uart cookie.
 | 
			
		||||
   * @param uartCookie    Pointer to uart cookie with information about the uart. Contains the
 | 
			
		||||
   *                      uart device file, baudrate, parity, stopbits etc.
 | 
			
		||||
   * @return  The file descriptor of the configured uart.
 | 
			
		||||
   */
 | 
			
		||||
  int configureUartPort();
 | 
			
		||||
 | 
			
		||||
  void setStopBitOptions(struct termios* options);
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @brief   This function sets options which are not configurable by the uartCookie.
 | 
			
		||||
   */
 | 
			
		||||
  void setFixedOptions(struct termios* options);
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @brief   With this function the datasize settings are added to the termios options struct.
 | 
			
		||||
   */
 | 
			
		||||
  void setDatasizeOptions(struct termios* options);
 | 
			
		||||
};
 | 
			
		||||
@@ -1,70 +0,0 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include <fsfw/devicehandlers/CookieIF.h>
 | 
			
		||||
#include <fsfw/objectmanager/SystemObjectIF.h>
 | 
			
		||||
#include <fsfw_hal/linux/serial/helper.h>
 | 
			
		||||
 | 
			
		||||
#include <string>
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @brief   Cookie for the UartComIF. There are many options available to configure the UART driver.
 | 
			
		||||
 *          The constructor only requests for common options like the baudrate. Other options can
 | 
			
		||||
 *          be set by member functions.
 | 
			
		||||
 *
 | 
			
		||||
 * @author 	J. Meier
 | 
			
		||||
 */
 | 
			
		||||
class SerialConfig : public CookieIF {
 | 
			
		||||
 public:
 | 
			
		||||
  /**
 | 
			
		||||
   * @brief	Constructor for the uart cookie.
 | 
			
		||||
   * @param deviceFile    The device file specifying the uart to use, e.g. "/dev/ttyPS1"
 | 
			
		||||
   * @param uartMode      Specify the UART mode. The canonical mode should be used if the
 | 
			
		||||
   *                      messages are separated by a delimited character like '\n'. See the
 | 
			
		||||
   *                      termios documentation for more information
 | 
			
		||||
   * @param baudrate      The baudrate to use for input and output.
 | 
			
		||||
   * @param maxReplyLen   The maximum size an object using this cookie expects
 | 
			
		||||
   * @details
 | 
			
		||||
   * Default configuration: No parity
 | 
			
		||||
   *                        8 databits (number of bits transfered with one uart frame)
 | 
			
		||||
   *                        One stop bit
 | 
			
		||||
   */
 | 
			
		||||
  SerialConfig(std::string deviceFile, UartBaudRate baudrate, size_t maxReplyLen,
 | 
			
		||||
               UartModes uartMode = UartModes::NON_CANONICAL)
 | 
			
		||||
      : deviceFile(deviceFile), baudrate(baudrate), maxReplyLen(maxReplyLen), uartMode(uartMode) {}
 | 
			
		||||
 | 
			
		||||
  virtual ~SerialConfig() = default;
 | 
			
		||||
 | 
			
		||||
  UartBaudRate getBaudrate() const { return baudrate; }
 | 
			
		||||
  size_t getMaxReplyLen() const { return maxReplyLen; }
 | 
			
		||||
  std::string getDeviceFile() const { return deviceFile; }
 | 
			
		||||
  Parity getParity() const { return parity; }
 | 
			
		||||
  BitsPerWord getBitsPerWord() const { return bitsPerWord; }
 | 
			
		||||
  StopBits getStopBits() const { return stopBits; }
 | 
			
		||||
  UartModes getUartMode() const { return uartMode; }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Functions two enable parity checking.
 | 
			
		||||
   */
 | 
			
		||||
  void setParityOdd() { parity = Parity::ODD; }
 | 
			
		||||
  void setParityEven() { parity = Parity::EVEN; }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Function two set number of bits per UART frame.
 | 
			
		||||
   */
 | 
			
		||||
  void setBitsPerWord(BitsPerWord bitsPerWord_) { bitsPerWord = bitsPerWord_; }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Function to specify the number of stopbits.
 | 
			
		||||
   */
 | 
			
		||||
  void setTwoStopBits() { stopBits = StopBits::TWO_STOP_BITS; }
 | 
			
		||||
  void setOneStopBit() { stopBits = StopBits::ONE_STOP_BIT; }
 | 
			
		||||
 | 
			
		||||
 private:
 | 
			
		||||
  std::string deviceFile;
 | 
			
		||||
  UartBaudRate baudrate;
 | 
			
		||||
  size_t maxReplyLen = 0;
 | 
			
		||||
  const UartModes uartMode;
 | 
			
		||||
  Parity parity = Parity::NONE;
 | 
			
		||||
  BitsPerWord bitsPerWord = BitsPerWord::BITS_8;
 | 
			
		||||
  StopBits stopBits = StopBits::ONE_STOP_BIT;
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										33
									
								
								linux/payload/mpsocRetvals.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								linux/payload/mpsocRetvals.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,33 @@
 | 
			
		||||
#ifndef MPSOC_RETURN_VALUES_IF_H_
 | 
			
		||||
#define MPSOC_RETURN_VALUES_IF_H_
 | 
			
		||||
 | 
			
		||||
#include "eive/resultClassIds.h"
 | 
			
		||||
#include "fsfw/returnvalues/returnvalue.h"
 | 
			
		||||
 | 
			
		||||
class MPSoCReturnValuesIF {
 | 
			
		||||
 public:
 | 
			
		||||
  static const uint8_t INTERFACE_ID = CLASS_ID::MPSOC_RETURN_VALUES_IF;
 | 
			
		||||
 | 
			
		||||
  //! [EXPORT] : [COMMENT] Space Packet received from PLOC has invalid CRC
 | 
			
		||||
  static const ReturnValue_t CRC_FAILURE = MAKE_RETURN_CODE(0xA0);
 | 
			
		||||
  //! [EXPORT] : [COMMENT] Received ACK failure reply from PLOC
 | 
			
		||||
  static const ReturnValue_t RECEIVED_ACK_FAILURE = MAKE_RETURN_CODE(0xA1);
 | 
			
		||||
  //! [EXPORT] : [COMMENT] Received execution failure reply from PLOC
 | 
			
		||||
  static const ReturnValue_t RECEIVED_EXE_FAILURE = MAKE_RETURN_CODE(0xA2);
 | 
			
		||||
  //! [EXPORT] : [COMMENT] Received space packet with invalid APID from PLOC
 | 
			
		||||
  static const ReturnValue_t INVALID_APID = MAKE_RETURN_CODE(0xA3);
 | 
			
		||||
  //! [EXPORT] : [COMMENT] Received command with invalid length
 | 
			
		||||
  static const ReturnValue_t INVALID_LENGTH = MAKE_RETURN_CODE(0xA4);
 | 
			
		||||
  //! [EXPORT] : [COMMENT] Filename of file in OBC filesystem is too long
 | 
			
		||||
  static const ReturnValue_t FILENAME_TOO_LONG = MAKE_RETURN_CODE(0xA5);
 | 
			
		||||
  //! [EXPORT] : [COMMENT] MPSoC helper is currently executing a command
 | 
			
		||||
  static const ReturnValue_t MPSOC_HELPER_EXECUTING = MAKE_RETURN_CODE(0xA6);
 | 
			
		||||
  //! [EXPORT] : [COMMENT] Filename of MPSoC file is to long (max. 256 bytes)
 | 
			
		||||
  static const ReturnValue_t MPSOC_FILENAME_TOO_LONG = MAKE_RETURN_CODE(0xA7);
 | 
			
		||||
  //! [EXPORT] : [COMMENT] Command has invalid parameter
 | 
			
		||||
  static const ReturnValue_t INVALID_PARAMETER = MAKE_RETURN_CODE(0xA8);
 | 
			
		||||
  //! [EXPORT] : [COMMENT] Received command has file string with invalid length
 | 
			
		||||
  static const ReturnValue_t NAME_TOO_LONG = MAKE_RETURN_CODE(0xA9);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif /* MPSOC_RETURN_VALUES_IF_H_ */
 | 
			
		||||
@@ -1,94 +1,87 @@
 | 
			
		||||
#include "plocMpsocHelpers.h"
 | 
			
		||||
 | 
			
		||||
#include "fsfw/tmtcpacket/ccsds/SpacePacketReader.h"
 | 
			
		||||
#include "mission/payload/plocSpBase.h"
 | 
			
		||||
 | 
			
		||||
uint16_t mpsoc::getStatusFromRawData(const uint8_t* data) {
 | 
			
		||||
  return (*(data + STATUS_OFFSET) << 8) | *(data + STATUS_OFFSET + 1);
 | 
			
		||||
}
 | 
			
		||||
std::string mpsoc::getStatusString(uint16_t status) {
 | 
			
		||||
  switch (status) {
 | 
			
		||||
    case (mpsoc::statusCode::UNKNOWN_APID): {
 | 
			
		||||
    case (mpsoc::status_code::UNKNOWN_APID): {
 | 
			
		||||
      return "Unknown APID";
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
    case (mpsoc::statusCode::INCORRECT_LENGTH): {
 | 
			
		||||
    case (mpsoc::status_code::INCORRECT_LENGTH): {
 | 
			
		||||
      return "Incorrect length";
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
    case (mpsoc::statusCode::FLASH_DRIVE_ERROR): {
 | 
			
		||||
      return "flash drive error";
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
    case (mpsoc::statusCode::INCORRECT_CRC): {
 | 
			
		||||
    case (mpsoc::status_code::INCORRECT_CRC): {
 | 
			
		||||
      return "Incorrect crc";
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
    case (mpsoc::statusCode::INCORRECT_PKT_SEQ_CNT): {
 | 
			
		||||
    case (mpsoc::status_code::INCORRECT_PKT_SEQ_CNT): {
 | 
			
		||||
      return "Incorrect packet sequence count";
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
    case (mpsoc::statusCode::TC_NOT_ALLOWED_IN_MODE): {
 | 
			
		||||
    case (mpsoc::status_code::TC_NOT_ALLOWED_IN_MODE): {
 | 
			
		||||
      return "TC not allowed in this mode";
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
    case (mpsoc::statusCode::TC_EXEUTION_DISABLED): {
 | 
			
		||||
    case (mpsoc::status_code::TC_EXEUTION_DISABLED): {
 | 
			
		||||
      return "TC execution disabled";
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
    case (mpsoc::statusCode::FLASH_MOUNT_FAILED): {
 | 
			
		||||
    case (mpsoc::status_code::FLASH_MOUNT_FAILED): {
 | 
			
		||||
      return "Flash mount failed";
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
    case (mpsoc::statusCode::FLASH_FILE_ALREADY_OPEN): {
 | 
			
		||||
    case (mpsoc::status_code::FLASH_FILE_ALREADY_OPEN): {
 | 
			
		||||
      return "Flash file already open";
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
    case (mpsoc::statusCode::FLASH_FILE_ALREADY_CLOSED): {
 | 
			
		||||
    case (mpsoc::status_code::FLASH_FILE_ALREADY_CLOSED): {
 | 
			
		||||
      return "Flash file already closed";
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
    case (mpsoc::statusCode::FLASH_FILE_OPEN_FAILED): {
 | 
			
		||||
    case (mpsoc::status_code::FLASH_FILE_OPEN_FAILED): {
 | 
			
		||||
      return "Flash file open failed";
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
    case (mpsoc::statusCode::FLASH_FILE_NOT_OPEN): {
 | 
			
		||||
    case (mpsoc::status_code::FLASH_FILE_NOT_OPEN): {
 | 
			
		||||
      return "Flash file not open";
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
    case (mpsoc::statusCode::FLASH_UNMOUNT_FAILED): {
 | 
			
		||||
    case (mpsoc::status_code::FLASH_UNMOUNT_FAILED): {
 | 
			
		||||
      return "Flash unmount failed";
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
    case (mpsoc::statusCode::HEAP_ALLOCATION_FAILED): {
 | 
			
		||||
    case (mpsoc::status_code::HEAP_ALLOCATION_FAILED): {
 | 
			
		||||
      return "Heap allocation failed";
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
    case (mpsoc::statusCode::INVALID_PARAMETER): {
 | 
			
		||||
    case (mpsoc::status_code::INVALID_PARAMETER): {
 | 
			
		||||
      return "Invalid parameter";
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
    case (mpsoc::statusCode::NOT_INITIALIZED): {
 | 
			
		||||
    case (mpsoc::status_code::NOT_INITIALIZED): {
 | 
			
		||||
      return "Not initialized";
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
    case (mpsoc::statusCode::REBOOT_IMMINENT): {
 | 
			
		||||
    case (mpsoc::status_code::REBOOT_IMMINENT): {
 | 
			
		||||
      return "Reboot imminent";
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
    case (mpsoc::statusCode::CORRUPT_DATA): {
 | 
			
		||||
    case (mpsoc::status_code::CORRUPT_DATA): {
 | 
			
		||||
      return "Corrupt data";
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
    case (mpsoc::statusCode::FLASH_CORRECTABLE_MISMATCH): {
 | 
			
		||||
    case (mpsoc::status_code::FLASH_CORRECTABLE_MISMATCH): {
 | 
			
		||||
      return "Flash correctable mismatch";
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
    case (mpsoc::statusCode::FLASH_UNCORRECTABLE_MISMATCH): {
 | 
			
		||||
    case (mpsoc::status_code::FLASH_UNCORRECTABLE_MISMATCH): {
 | 
			
		||||
      return "Flash uncorrectable mismatch";
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
    case (mpsoc::statusCode::DEFAULT_ERROR_CODE): {
 | 
			
		||||
    case (mpsoc::status_code::DEFAULT_ERROR_CODE): {
 | 
			
		||||
      return "Default error code";
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
@@ -100,19 +93,3 @@ std::string mpsoc::getStatusString(uint16_t status) {
 | 
			
		||||
  }
 | 
			
		||||
  return "";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void mpsoc::printRxPacket(const SpacePacketReader& spReader) {
 | 
			
		||||
  if (mpsoc::MPSOC_RX_WIRETAPPING) {
 | 
			
		||||
    sif::debug << "RECV MPSOC packet. APID 0x" << std::hex << std::setw(3) << spReader.getApid()
 | 
			
		||||
               << std::dec << " Size " << spReader.getFullPacketLen() << " SSC "
 | 
			
		||||
               << spReader.getSequenceCount() << std::endl;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void mpsoc::printTxPacket(const ploc::SpTcBase& tcBase) {
 | 
			
		||||
  if (mpsoc::MPSOC_TX_WIRETAPPING) {
 | 
			
		||||
    sif::debug << "SEND MPSOC packet. APID 0x" << std::hex << std::setw(3) << tcBase.getApid()
 | 
			
		||||
               << " Size " << std::dec << tcBase.getFullPacketLen() << " SSC "
 | 
			
		||||
               << tcBase.getSeqCount() << std::endl;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -3,124 +3,16 @@
 | 
			
		||||
 | 
			
		||||
#include <fsfw/datapoollocal/StaticLocalDataSet.h>
 | 
			
		||||
#include <fsfw/devicehandlers/DeviceHandlerIF.h>
 | 
			
		||||
#include <linux/payload/mpsocRetvals.h>
 | 
			
		||||
#include <mission/payload/plocSpBase.h>
 | 
			
		||||
 | 
			
		||||
#include "eive/eventSubsystemIds.h"
 | 
			
		||||
#include "eive/resultClassIds.h"
 | 
			
		||||
#include "fsfw/action/HasActionsIF.h"
 | 
			
		||||
#include "fsfw/events/Event.h"
 | 
			
		||||
#include "fsfw/returnvalues/returnvalue.h"
 | 
			
		||||
#include "OBSWConfig.h"
 | 
			
		||||
#include "eive/definitions.h"
 | 
			
		||||
#include "fsfw/globalfunctions/CRC.h"
 | 
			
		||||
#include "fsfw/serialize/SerializeAdapter.h"
 | 
			
		||||
#include "fsfw/serialize/SerializeIF.h"
 | 
			
		||||
 | 
			
		||||
namespace mpsoc {
 | 
			
		||||
 | 
			
		||||
static constexpr bool MPSOC_TX_WIRETAPPING = false;
 | 
			
		||||
static constexpr bool MPSOC_RX_WIRETAPPING = false;
 | 
			
		||||
 | 
			
		||||
static constexpr size_t CRC_SIZE = 2;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @brief   Abstract base class for TC space packet of MPSoC.
 | 
			
		||||
 */
 | 
			
		||||
class TcBase : public ploc::SpTcBase {
 | 
			
		||||
 public:
 | 
			
		||||
  virtual ~TcBase() = default;
 | 
			
		||||
 | 
			
		||||
  // Initial length field of space packet. Will always be updated when packet is created.
 | 
			
		||||
  static const uint16_t INIT_LENGTH = CRC_SIZE;
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @brief    Constructor
 | 
			
		||||
   *
 | 
			
		||||
   * @param sequenceCount Sequence count of space packet which will be incremented with each
 | 
			
		||||
   *        sent and received packets.
 | 
			
		||||
   */
 | 
			
		||||
  TcBase(ploc::SpTcParams params, uint16_t apid, uint16_t sequenceCount)
 | 
			
		||||
      : ploc::SpTcBase(params, apid, 0, sequenceCount) {
 | 
			
		||||
    payloadStart = spParams.buf + ccsds::HEADER_LEN;
 | 
			
		||||
    spParams.setFullPayloadLen(INIT_LENGTH);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @brief   Function to finsh and write the space packet. It is expected that the user has
 | 
			
		||||
   * set the payload fields in the child class*
 | 
			
		||||
   * @return  returnvalue::OK if packet creation was successful, otherwise error return value
 | 
			
		||||
   */
 | 
			
		||||
  ReturnValue_t finishPacket() {
 | 
			
		||||
    updateSpFields();
 | 
			
		||||
    ReturnValue_t res = checkSizeAndSerializeHeader();
 | 
			
		||||
    if (res != returnvalue::OK) {
 | 
			
		||||
      return res;
 | 
			
		||||
    }
 | 
			
		||||
    return calcAndSetCrc();
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
void printRxPacket(const SpacePacketReader& spReader);
 | 
			
		||||
void printTxPacket(const ploc::SpTcBase& tcBase);
 | 
			
		||||
 | 
			
		||||
static constexpr uint32_t DEFAULT_CMD_TIMEOUT_MS = 5000;
 | 
			
		||||
static constexpr uint32_t CMD_TIMEOUT_MKFS = 15000;
 | 
			
		||||
 | 
			
		||||
enum FlashId : uint8_t { FLASH_0 = 0, FLASH_1 = 1 };
 | 
			
		||||
 | 
			
		||||
static const uint8_t INTERFACE_ID = CLASS_ID::MPSOC_RETURN_VALUES_IF;
 | 
			
		||||
 | 
			
		||||
//! [EXPORT] : [COMMENT] Space Packet received from PLOC has invalid CRC
 | 
			
		||||
static const ReturnValue_t CRC_FAILURE = MAKE_RETURN_CODE(0xA0);
 | 
			
		||||
//! [EXPORT] : [COMMENT] Received ACK failure reply from PLOC
 | 
			
		||||
static const ReturnValue_t RECEIVED_ACK_FAILURE = MAKE_RETURN_CODE(0xA1);
 | 
			
		||||
//! [EXPORT] : [COMMENT] Received execution failure reply from PLOC
 | 
			
		||||
static const ReturnValue_t RECEIVED_EXE_FAILURE = MAKE_RETURN_CODE(0xA2);
 | 
			
		||||
//! [EXPORT] : [COMMENT] Received space packet with invalid APID from PLOC
 | 
			
		||||
static const ReturnValue_t INVALID_APID = MAKE_RETURN_CODE(0xA3);
 | 
			
		||||
//! [EXPORT] : [COMMENT] Received command with invalid length
 | 
			
		||||
static const ReturnValue_t INVALID_LENGTH = MAKE_RETURN_CODE(0xA4);
 | 
			
		||||
//! [EXPORT] : [COMMENT] Filename of file in OBC filesystem is too long
 | 
			
		||||
static const ReturnValue_t FILENAME_TOO_LONG = MAKE_RETURN_CODE(0xA5);
 | 
			
		||||
//! [EXPORT] : [COMMENT] MPSoC helper is currently executing a command
 | 
			
		||||
static const ReturnValue_t MPSOC_HELPER_EXECUTING = MAKE_RETURN_CODE(0xA6);
 | 
			
		||||
//! [EXPORT] : [COMMENT] Filename of MPSoC file is to long (max. 256 bytes)
 | 
			
		||||
static const ReturnValue_t MPSOC_FILENAME_TOO_LONG = MAKE_RETURN_CODE(0xA7);
 | 
			
		||||
//! [EXPORT] : [COMMENT] Command has invalid parameter
 | 
			
		||||
static const ReturnValue_t INVALID_PARAMETER = MAKE_RETURN_CODE(0xA8);
 | 
			
		||||
//! [EXPORT] : [COMMENT] Received command has file string with invalid length
 | 
			
		||||
static const ReturnValue_t NAME_TOO_LONG = MAKE_RETURN_CODE(0xA9);
 | 
			
		||||
//! [EXPORT] : [COMMENT] Command has timed out.
 | 
			
		||||
static const ReturnValue_t COMMAND_TIMEOUT = MAKE_RETURN_CODE(0x10);
 | 
			
		||||
 | 
			
		||||
static const uint8_t SUBSYSTEM_ID = SUBSYSTEM_ID::PLOC_MPSOC_HANDLER;
 | 
			
		||||
 | 
			
		||||
//! [EXPORT] : [COMMENT] PLOC crc failure in telemetry packet
 | 
			
		||||
static const Event MEMORY_READ_RPT_CRC_FAILURE = MAKE_EVENT(1, severity::LOW);
 | 
			
		||||
//! [EXPORT] : [COMMENT] PLOC receive acknowledgment failure report
 | 
			
		||||
//! P1: Command Id which leads the acknowledgment failure report
 | 
			
		||||
//! P2: The status field inserted by the MPSoC into the data field
 | 
			
		||||
static const Event ACK_FAILURE = MAKE_EVENT(2, severity::LOW);
 | 
			
		||||
//! [EXPORT] : [COMMENT] PLOC receive execution failure report
 | 
			
		||||
//! P1: Command Id which leads the execution failure report
 | 
			
		||||
//! P2: The status field inserted by the MPSoC into the data field
 | 
			
		||||
static const Event EXE_FAILURE = MAKE_EVENT(3, severity::LOW);
 | 
			
		||||
//! [EXPORT] : [COMMENT] PLOC reply has invalid crc
 | 
			
		||||
static const Event MPSOC_HANDLER_CRC_FAILURE = MAKE_EVENT(4, severity::LOW);
 | 
			
		||||
//! [EXPORT] : [COMMENT] Packet sequence count in received space packet does not match expected
 | 
			
		||||
//! count P1: Expected sequence count P2: Received sequence count
 | 
			
		||||
static const Event MPSOC_HANDLER_SEQUENCE_COUNT_MISMATCH = MAKE_EVENT(5, severity::LOW);
 | 
			
		||||
//! [EXPORT] : [COMMENT] Supervisor fails to shutdown MPSoC. Requires to power off the PLOC and
 | 
			
		||||
//! thus also to shutdown the supervisor.
 | 
			
		||||
static const Event MPSOC_SHUTDOWN_FAILED = MAKE_EVENT(6, severity::HIGH);
 | 
			
		||||
//! [EXPORT] : [COMMENT] SUPV not on for boot or shutdown process. P1: 0 for OFF transition, 1 for
 | 
			
		||||
//! ON transition.
 | 
			
		||||
static constexpr Event SUPV_NOT_ON = event::makeEvent(SUBSYSTEM_ID, 7, severity::LOW);
 | 
			
		||||
//! [EXPORT] : [COMMENT] SUPV reply timeout.
 | 
			
		||||
static constexpr Event SUPV_REPLY_TIMEOUT = event::makeEvent(SUBSYSTEM_ID, 8, severity::LOW);
 | 
			
		||||
//! [EXPORT] : [COMMENT] Camera must be commanded on first.
 | 
			
		||||
static constexpr Event CAM_MUST_BE_ON_FOR_SNAPSHOT_MODE =
 | 
			
		||||
    event::makeEvent(SUBSYSTEM_ID, 9, severity::LOW);
 | 
			
		||||
 | 
			
		||||
enum ParamId : uint8_t { SKIP_SUPV_ON_COMMANDING = 0x01 };
 | 
			
		||||
 | 
			
		||||
enum FileAccessModes : uint8_t {
 | 
			
		||||
  // Opens a file, fails if the file does not exist.
 | 
			
		||||
  OPEN_EXISTING = 0x00,
 | 
			
		||||
@@ -136,8 +28,6 @@ enum FileAccessModes : uint8_t {
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static constexpr uint32_t HK_SET_ID = 0;
 | 
			
		||||
static constexpr uint32_t DEADBEEF_ADDR = 0x40000004;
 | 
			
		||||
static constexpr uint32_t DEADBEEF_VALUE = 0xdeadbeef;
 | 
			
		||||
 | 
			
		||||
namespace poolid {
 | 
			
		||||
enum {
 | 
			
		||||
@@ -200,8 +90,7 @@ static const DeviceCommandId_t TM_CAM_CMD_RPT = 19;
 | 
			
		||||
static const DeviceCommandId_t SET_UART_TX_TRISTATE = 20;
 | 
			
		||||
static const DeviceCommandId_t RELEASE_UART_TX = 21;
 | 
			
		||||
static const DeviceCommandId_t TC_CAM_TAKE_PIC = 22;
 | 
			
		||||
// Stream file down using E-Band component directly.
 | 
			
		||||
static const DeviceCommandId_t TC_SIMPLEX_STREAM_FILE = 23;
 | 
			
		||||
static const DeviceCommandId_t TC_SIMPLEX_SEND_FILE = 23;
 | 
			
		||||
static const DeviceCommandId_t TC_DOWNLINK_DATA_MODULATE = 24;
 | 
			
		||||
static const DeviceCommandId_t TC_MODE_SNAPSHOT = 25;
 | 
			
		||||
static const DeviceCommandId_t TC_GET_HK_REPORT = 26;
 | 
			
		||||
@@ -209,31 +98,16 @@ static const DeviceCommandId_t TM_GET_HK_REPORT = 27;
 | 
			
		||||
static const DeviceCommandId_t TC_FLASH_GET_DIRECTORY_CONTENT = 28;
 | 
			
		||||
static const DeviceCommandId_t TM_FLASH_DIRECTORY_CONTENT = 29;
 | 
			
		||||
static constexpr DeviceCommandId_t TC_FLASH_READ_FULL_FILE = 30;
 | 
			
		||||
// Store file on MPSoC.
 | 
			
		||||
static const DeviceCommandId_t TC_SPLIT_FILE = 31;
 | 
			
		||||
static const DeviceCommandId_t TC_VERIFY_BOOT = 32;
 | 
			
		||||
static const DeviceCommandId_t TC_ENABLE_TC_EXECTION = 33;
 | 
			
		||||
static const DeviceCommandId_t TC_FLASH_MKFS = 34;
 | 
			
		||||
 | 
			
		||||
// Will reset the sequence count of the OBSW. Not required anymore after MPSoC update.
 | 
			
		||||
static const DeviceCommandId_t OBSW_RESET_SEQ_COUNT_LEGACY = 50;
 | 
			
		||||
// Will reset the sequence count of the OBSW
 | 
			
		||||
static const DeviceCommandId_t OBSW_RESET_SEQ_COUNT = 50;
 | 
			
		||||
 | 
			
		||||
static const uint16_t SIZE_ACK_REPORT = 14;
 | 
			
		||||
static const uint16_t SIZE_EXE_REPORT = 14;
 | 
			
		||||
static const uint16_t SIZE_TM_MEM_READ_REPORT = 18;
 | 
			
		||||
static const uint16_t SIZE_TM_CAM_CMD_RPT = 18;
 | 
			
		||||
static constexpr size_t SIZE_TM_HK_REPORT = 369;
 | 
			
		||||
 | 
			
		||||
enum Submode : uint8_t { IDLE_OR_NONE = 0, REPLAY = 1, SNAPSHOT = 2 };
 | 
			
		||||
 | 
			
		||||
// Setting the internal mode value to the actual telecommand ID
 | 
			
		||||
/*
 | 
			
		||||
enum InternalMode {
 | 
			
		||||
  OFF = HasModesIF::MODE_OFF,
 | 
			
		||||
  IDLE = ,
 | 
			
		||||
  REPLAY = TC_MODE_REPLAY,
 | 
			
		||||
  SNAPSHOT = TC_MODE_SNAPSHOT
 | 
			
		||||
};
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * SpacePacket apids of PLOC telecommands and telemetry.
 | 
			
		||||
 */
 | 
			
		||||
@@ -258,8 +132,6 @@ static const uint16_t TC_MODE_SNAPSHOT = 0x120;
 | 
			
		||||
static const uint16_t TC_DOWNLINK_DATA_MODULATE = 0x121;
 | 
			
		||||
static constexpr uint16_t TC_HK_GET_REPORT = 0x123;
 | 
			
		||||
static const uint16_t TC_DOWNLINK_PWR_OFF = 0x124;
 | 
			
		||||
static constexpr uint16_t TC_ENABLE_TC_EXECUTION = 0x129;
 | 
			
		||||
static constexpr uint16_t TC_FLASH_MKFS = 0x12A;
 | 
			
		||||
static const uint16_t TC_CAM_CMD_SEND = 0x12C;
 | 
			
		||||
static constexpr uint16_t TC_FLASH_COPY_FILE = 0x12E;
 | 
			
		||||
static const uint16_t TC_SIMPLEX_SEND_FILE = 0x130;
 | 
			
		||||
@@ -284,15 +156,15 @@ static const uint8_t SPACE_PACKET_HEADER_SIZE = 6;
 | 
			
		||||
 | 
			
		||||
static const uint8_t STATUS_OFFSET = 10;
 | 
			
		||||
 | 
			
		||||
static constexpr size_t CRC_SIZE = 2;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * The size of payload data which will be forwarded to the requesting object. e.g. PUS Service
 | 
			
		||||
 * 8.
 | 
			
		||||
 */
 | 
			
		||||
static const uint8_t SIZE_MEM_READ_RPT_FIX = 6;
 | 
			
		||||
 | 
			
		||||
static const size_t FILENAME_FIELD_SIZE = 256;
 | 
			
		||||
// Subtract size of NULL terminator.
 | 
			
		||||
static const size_t MAX_FILENAME_SIZE = FILENAME_FIELD_SIZE - 1;
 | 
			
		||||
static const size_t MAX_FILENAME_SIZE = 256;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * PLOC space packet length for fixed size packets. This is the size of the whole packet data
 | 
			
		||||
@@ -327,9 +199,8 @@ static const uint16_t TC_DOWNLINK_PWR_ON_EXECUTION_DELAY = 8;
 | 
			
		||||
static const uint16_t TC_CAM_TAKE_PIC_EXECUTION_DELAY = 20;
 | 
			
		||||
static const uint16_t TC_SIMPLEX_SEND_FILE_DELAY = 80;
 | 
			
		||||
 | 
			
		||||
namespace statusCode {
 | 
			
		||||
namespace status_code {
 | 
			
		||||
static const uint16_t DEFAULT_ERROR_CODE = 0x1;
 | 
			
		||||
static constexpr uint16_t FLASH_DRIVE_ERROR = 0xb;
 | 
			
		||||
static const uint16_t UNKNOWN_APID = 0x5DD;
 | 
			
		||||
static const uint16_t INCORRECT_LENGTH = 0x5DE;
 | 
			
		||||
static const uint16_t INCORRECT_CRC = 0x5DF;
 | 
			
		||||
@@ -354,12 +225,49 @@ static const uint16_t RESERVED_1 = 0x5F1;
 | 
			
		||||
static const uint16_t RESERVED_2 = 0x5F2;
 | 
			
		||||
static const uint16_t RESERVED_3 = 0x5F3;
 | 
			
		||||
static const uint16_t RESERVED_4 = 0x5F4;
 | 
			
		||||
}  // namespace statusCode
 | 
			
		||||
}  // namespace status_code
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @brief   Abstract base class for TC space packet of MPSoC.
 | 
			
		||||
 */
 | 
			
		||||
class TcBase : public ploc::SpTcBase, public MPSoCReturnValuesIF {
 | 
			
		||||
 public:
 | 
			
		||||
  virtual ~TcBase() = default;
 | 
			
		||||
 | 
			
		||||
  // Initial length field of space packet. Will always be updated when packet is created.
 | 
			
		||||
  static const uint16_t INIT_LENGTH = CRC_SIZE;
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @brief    Constructor
 | 
			
		||||
   *
 | 
			
		||||
   * @param sequenceCount Sequence count of space packet which will be incremented with each
 | 
			
		||||
   *        sent and received packets.
 | 
			
		||||
   */
 | 
			
		||||
  TcBase(ploc::SpTcParams params, uint16_t apid, uint16_t sequenceCount)
 | 
			
		||||
      : ploc::SpTcBase(params, apid, 0, sequenceCount) {
 | 
			
		||||
    payloadStart = spParams.buf + ccsds::HEADER_LEN;
 | 
			
		||||
    spParams.setFullPayloadLen(INIT_LENGTH);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @brief   Function to finsh and write the space packet. It is expected that the user has
 | 
			
		||||
   * set the payload fields in the child class*
 | 
			
		||||
   * @return  returnvalue::OK if packet creation was successful, otherwise error return value
 | 
			
		||||
   */
 | 
			
		||||
  ReturnValue_t finishPacket() {
 | 
			
		||||
    updateSpFields();
 | 
			
		||||
    ReturnValue_t res = checkSizeAndSerializeHeader();
 | 
			
		||||
    if (res != returnvalue::OK) {
 | 
			
		||||
      return res;
 | 
			
		||||
    }
 | 
			
		||||
    return calcAndSetCrc();
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @brief   This class helps to build the memory read command for the PLOC.
 | 
			
		||||
 */
 | 
			
		||||
class TcMemRead : public mpsoc::TcBase {
 | 
			
		||||
class TcMemRead : public TcBase {
 | 
			
		||||
 public:
 | 
			
		||||
  /**
 | 
			
		||||
   * @brief   Constructor
 | 
			
		||||
@@ -409,7 +317,7 @@ class TcMemRead : public mpsoc::TcBase {
 | 
			
		||||
 * @brief   This class helps to generate the space packet to write data to a memory address within
 | 
			
		||||
 *          the PLOC.
 | 
			
		||||
 */
 | 
			
		||||
class TcMemWrite : public mpsoc::TcBase {
 | 
			
		||||
class TcMemWrite : public TcBase {
 | 
			
		||||
 public:
 | 
			
		||||
  /**
 | 
			
		||||
   * @brief   Constructor
 | 
			
		||||
@@ -459,21 +367,24 @@ class TcMemWrite : public mpsoc::TcBase {
 | 
			
		||||
/**
 | 
			
		||||
 * @brief   Class to help creation of flash fopen command.
 | 
			
		||||
 */
 | 
			
		||||
class TcFlashFopen : public mpsoc::TcBase {
 | 
			
		||||
class FlashFopen : public TcBase {
 | 
			
		||||
 public:
 | 
			
		||||
  TcFlashFopen(ploc::SpTcParams params, uint16_t sequenceCount)
 | 
			
		||||
  FlashFopen(ploc::SpTcParams params, uint16_t sequenceCount)
 | 
			
		||||
      : TcBase(params, apid::TC_FLASHFOPEN, sequenceCount) {}
 | 
			
		||||
 | 
			
		||||
  ReturnValue_t setPayload(std::string filename, uint8_t mode) {
 | 
			
		||||
    accessMode = mode;
 | 
			
		||||
    size_t nameSize = filename.size();
 | 
			
		||||
    spParams.setFullPayloadLen(256 + sizeof(uint8_t) + CRC_SIZE);
 | 
			
		||||
    ReturnValue_t result = checkPayloadLen();
 | 
			
		||||
    if (result != returnvalue::OK) {
 | 
			
		||||
      return result;
 | 
			
		||||
    }
 | 
			
		||||
    std::memset(payloadStart, 0, FILENAME_FIELD_SIZE);
 | 
			
		||||
    std::memcpy(payloadStart, filename.c_str(), filename.size());
 | 
			
		||||
    payloadStart[FILENAME_FIELD_SIZE] = accessMode;
 | 
			
		||||
    spParams.setFullPayloadLen(FILENAME_FIELD_SIZE + 1 + CRC_SIZE);
 | 
			
		||||
    std::memcpy(payloadStart, filename.c_str(), nameSize);
 | 
			
		||||
    // payloadStart[nameSize] = NULL_TERMINATOR;
 | 
			
		||||
    std::memset(payloadStart + nameSize, 0, 256 - nameSize);
 | 
			
		||||
    // payloadStart[255] = NULL_TERMINATOR;
 | 
			
		||||
    payloadStart[256] = accessMode;
 | 
			
		||||
    return returnvalue::OK;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@@ -484,46 +395,14 @@ class TcFlashFopen : public mpsoc::TcBase {
 | 
			
		||||
/**
 | 
			
		||||
 * @brief   Class to help creation of flash fclose command.
 | 
			
		||||
 */
 | 
			
		||||
class TcFlashFclose : public TcBase {
 | 
			
		||||
class FlashFclose : public TcBase {
 | 
			
		||||
 public:
 | 
			
		||||
  TcFlashFclose(ploc::SpTcParams params, uint16_t sequenceCount)
 | 
			
		||||
  FlashFclose(ploc::SpTcParams params, uint16_t sequenceCount)
 | 
			
		||||
      : TcBase(params, apid::TC_FLASHFCLOSE, sequenceCount) {
 | 
			
		||||
    spParams.setFullPayloadLen(CRC_SIZE);
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class TcEnableTcExec : public TcBase {
 | 
			
		||||
 public:
 | 
			
		||||
  TcEnableTcExec(ploc::SpTcParams params, uint16_t sequenceCount)
 | 
			
		||||
      : TcBase(params, apid::TC_ENABLE_TC_EXECUTION, sequenceCount) {
 | 
			
		||||
    spParams.setFullPayloadLen(CRC_SIZE);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  ReturnValue_t setPayload(const uint8_t* cmdData, size_t cmdDataLen) {
 | 
			
		||||
    if (cmdDataLen != 2) {
 | 
			
		||||
      return HasActionsIF::INVALID_PARAMETERS;
 | 
			
		||||
    }
 | 
			
		||||
    std::memcpy(payloadStart, cmdData, 2);
 | 
			
		||||
    spParams.setFullPayloadLen(2 + CRC_SIZE);
 | 
			
		||||
    return returnvalue::OK;
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class TcFlashMkfs : public TcBase {
 | 
			
		||||
 public:
 | 
			
		||||
  TcFlashMkfs(ploc::SpTcParams params, uint16_t sequenceCount, FlashId flashId)
 | 
			
		||||
      : TcBase(params, apid::TC_FLASH_MKFS, sequenceCount) {
 | 
			
		||||
    const char* flashIdStr = "0:\\";
 | 
			
		||||
    if (flashId == FlashId::FLASH_1) {
 | 
			
		||||
      flashIdStr = "1:\\";
 | 
			
		||||
    }
 | 
			
		||||
    std::memcpy(payloadStart, flashIdStr, 3);
 | 
			
		||||
    // Null terminator
 | 
			
		||||
    payloadStart[3] = 0;
 | 
			
		||||
    spParams.setFullPayloadLen(4 + CRC_SIZE);
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @brief   Class to build flash write space packet.
 | 
			
		||||
 */
 | 
			
		||||
@@ -583,6 +462,15 @@ class TcFlashRead : public TcBase {
 | 
			
		||||
    if (result != returnvalue::OK) {
 | 
			
		||||
      return result;
 | 
			
		||||
    }
 | 
			
		||||
    updateSpFields();
 | 
			
		||||
    result = checkSizeAndSerializeHeader();
 | 
			
		||||
    if (result != returnvalue::OK) {
 | 
			
		||||
      return result;
 | 
			
		||||
    }
 | 
			
		||||
    result = calcAndSetCrc();
 | 
			
		||||
    if (result != returnvalue::OK) {
 | 
			
		||||
      return result;
 | 
			
		||||
    }
 | 
			
		||||
    readSize = readLen;
 | 
			
		||||
    return result;
 | 
			
		||||
  }
 | 
			
		||||
@@ -600,14 +488,20 @@ class TcFlashDelete : public TcBase {
 | 
			
		||||
 | 
			
		||||
  ReturnValue_t setPayload(std::string filename) {
 | 
			
		||||
    size_t nameSize = filename.size();
 | 
			
		||||
    spParams.setFullPayloadLen(FILENAME_FIELD_SIZE + CRC_SIZE);
 | 
			
		||||
    spParams.setFullPayloadLen(nameSize + sizeof(NULL_TERMINATOR) + CRC_SIZE);
 | 
			
		||||
    auto res = checkPayloadLen();
 | 
			
		||||
    if (res != returnvalue::OK) {
 | 
			
		||||
      return res;
 | 
			
		||||
    }
 | 
			
		||||
    std::memcpy(payloadStart, filename.c_str(), nameSize);
 | 
			
		||||
    *(payloadStart + nameSize) = NULL_TERMINATOR;
 | 
			
		||||
    return returnvalue::OK;
 | 
			
		||||
 | 
			
		||||
    updateSpFields();
 | 
			
		||||
    res = checkSizeAndSerializeHeader();
 | 
			
		||||
    if (res != returnvalue::OK) {
 | 
			
		||||
      return res;
 | 
			
		||||
    }
 | 
			
		||||
    return calcAndSetCrc();
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@@ -759,9 +653,8 @@ class TcGetDirContent : public TcBase {
 | 
			
		||||
    if (result != returnvalue::OK) {
 | 
			
		||||
      return result;
 | 
			
		||||
    }
 | 
			
		||||
    std::memset(payloadStart, 0, 256);
 | 
			
		||||
    std::memcpy(payloadStart, commandData, commandDataLen);
 | 
			
		||||
    payloadStart[255] = 0;
 | 
			
		||||
    payloadStart[255] = '\0';
 | 
			
		||||
    return result;
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
@@ -802,7 +695,7 @@ class TcReplayWriteSeq : public TcBase {
 | 
			
		||||
  static const size_t USE_DECODING_LENGTH = 1;
 | 
			
		||||
 | 
			
		||||
  ReturnValue_t lengthCheck(size_t commandDataLen) {
 | 
			
		||||
    if (commandDataLen > USE_DECODING_LENGTH + FILENAME_FIELD_SIZE or
 | 
			
		||||
    if (commandDataLen > USE_DECODING_LENGTH + MAX_FILENAME_SIZE or
 | 
			
		||||
        checkPayloadLen() != returnvalue::OK) {
 | 
			
		||||
      sif::warning << "TcReplayWriteSeq: Command has invalid length " << commandDataLen
 | 
			
		||||
                   << std::endl;
 | 
			
		||||
@@ -815,24 +708,24 @@ class TcReplayWriteSeq : public TcBase {
 | 
			
		||||
/**
 | 
			
		||||
 * @brief   Helps to extract the fields of the flash write command from the PUS packet.
 | 
			
		||||
 */
 | 
			
		||||
class FlashBasePusCmd {
 | 
			
		||||
class FlashBasePusCmd : public MPSoCReturnValuesIF {
 | 
			
		||||
 public:
 | 
			
		||||
  FlashBasePusCmd() = default;
 | 
			
		||||
  virtual ~FlashBasePusCmd() = default;
 | 
			
		||||
 | 
			
		||||
  virtual ReturnValue_t extractFields(const uint8_t* commandData, size_t commandDataLen) {
 | 
			
		||||
    if (commandDataLen > FILENAME_FIELD_SIZE) {
 | 
			
		||||
    if (commandDataLen > (config::MAX_PATH_SIZE + config::MAX_FILENAME_SIZE + MAX_FILENAME_SIZE)) {
 | 
			
		||||
      return INVALID_LENGTH;
 | 
			
		||||
    }
 | 
			
		||||
    size_t fileLen = strnlen(reinterpret_cast<const char*>(commandData), commandDataLen);
 | 
			
		||||
    if (fileLen > MAX_FILENAME_SIZE) {
 | 
			
		||||
    if (fileLen > (config::MAX_PATH_SIZE + config::MAX_FILENAME_SIZE)) {
 | 
			
		||||
      return FILENAME_TOO_LONG;
 | 
			
		||||
    }
 | 
			
		||||
    obcFile = std::string(reinterpret_cast<const char*>(commandData), fileLen);
 | 
			
		||||
    fileLen =
 | 
			
		||||
        strnlen(reinterpret_cast<const char*>(commandData + obcFile.size() + SIZE_NULL_TERMINATOR),
 | 
			
		||||
                commandDataLen - obcFile.size() - 1);
 | 
			
		||||
    if (fileLen > FILENAME_FIELD_SIZE) {
 | 
			
		||||
    if (fileLen > MAX_FILENAME_SIZE) {
 | 
			
		||||
      return MPSOC_FILENAME_TOO_LONG;
 | 
			
		||||
    }
 | 
			
		||||
    mpsocFile = std::string(
 | 
			
		||||
@@ -843,11 +736,11 @@ class FlashBasePusCmd {
 | 
			
		||||
 | 
			
		||||
  const std::string& getObcFile() const { return obcFile; }
 | 
			
		||||
 | 
			
		||||
  const std::string& getMpsocFile() const { return mpsocFile; }
 | 
			
		||||
  const std::string& getMPSoCFile() const { return mpsocFile; }
 | 
			
		||||
 | 
			
		||||
 protected:
 | 
			
		||||
  size_t getParsedSize() const {
 | 
			
		||||
    return getObcFile().size() + getMpsocFile().size() + 2 * SIZE_NULL_TERMINATOR;
 | 
			
		||||
    return getObcFile().size() + getMPSoCFile().size() + 2 * SIZE_NULL_TERMINATOR;
 | 
			
		||||
  }
 | 
			
		||||
  static const size_t SIZE_NULL_TERMINATOR = 1;
 | 
			
		||||
 | 
			
		||||
@@ -858,7 +751,7 @@ class FlashBasePusCmd {
 | 
			
		||||
 | 
			
		||||
class FlashReadPusCmd : public FlashBasePusCmd {
 | 
			
		||||
 public:
 | 
			
		||||
  FlashReadPusCmd() {};
 | 
			
		||||
  FlashReadPusCmd(){};
 | 
			
		||||
 | 
			
		||||
  ReturnValue_t extractFields(const uint8_t* commandData, size_t commandDataLen) override {
 | 
			
		||||
    ReturnValue_t result = FlashBasePusCmd::extractFields(commandData, commandDataLen);
 | 
			
		||||
@@ -914,191 +807,49 @@ class TcCamTakePic : public TcBase {
 | 
			
		||||
      : TcBase(params, apid::TC_CAM_TAKE_PIC, sequenceCount) {}
 | 
			
		||||
 | 
			
		||||
  ReturnValue_t setPayload(const uint8_t* commandData, size_t commandDataLen) {
 | 
			
		||||
    const uint8_t** dataPtr = &commandData;
 | 
			
		||||
    if (commandDataLen > FULL_PAYLOAD_SIZE) {
 | 
			
		||||
      return INVALID_LENGTH;
 | 
			
		||||
    }
 | 
			
		||||
    size_t deserLen = commandDataLen;
 | 
			
		||||
    size_t serLen = 0;
 | 
			
		||||
    fileName = std::string(reinterpret_cast<const char*>(commandData));
 | 
			
		||||
    if (fileName.size() > MAX_FILENAME_SIZE) {
 | 
			
		||||
      return FILENAME_TOO_LONG;
 | 
			
		||||
    }
 | 
			
		||||
    deserLen -= fileName.length() + 1;
 | 
			
		||||
    *dataPtr += fileName.length() + 1;
 | 
			
		||||
    uint8_t** payloadPtr = &payloadStart;
 | 
			
		||||
    memset(payloadStart, 0, FILENAME_FIELD_SIZE);
 | 
			
		||||
    memcpy(payloadStart, fileName.data(), fileName.size());
 | 
			
		||||
    *payloadPtr += FILENAME_FIELD_SIZE;
 | 
			
		||||
    serLen += FILENAME_FIELD_SIZE;
 | 
			
		||||
    ReturnValue_t result = SerializeAdapter::deSerialize(&encoderSettingY, dataPtr, &deserLen,
 | 
			
		||||
                                                         SerializeIF::Endianness::NETWORK);
 | 
			
		||||
    if (result != returnvalue::OK) {
 | 
			
		||||
      return result;
 | 
			
		||||
    }
 | 
			
		||||
    result = SerializeAdapter::serialize(&encoderSettingY, payloadPtr, &serLen, FULL_PAYLOAD_SIZE,
 | 
			
		||||
                                         SerializeIF::Endianness::NETWORK);
 | 
			
		||||
    if (result != returnvalue::OK) {
 | 
			
		||||
      return result;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    result = SerializeAdapter::deSerialize(&quantizationY, dataPtr, &deserLen,
 | 
			
		||||
                                           SerializeIF::Endianness::NETWORK);
 | 
			
		||||
    if (result != returnvalue::OK) {
 | 
			
		||||
      return result;
 | 
			
		||||
    }
 | 
			
		||||
    result = SerializeAdapter::serialize(&quantizationY, payloadPtr, &serLen, FULL_PAYLOAD_SIZE,
 | 
			
		||||
                                         SerializeIF::Endianness::NETWORK);
 | 
			
		||||
    if (result != returnvalue::OK) {
 | 
			
		||||
      return result;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    result = SerializeAdapter::deSerialize(&encoderSettingsCb, dataPtr, &deserLen,
 | 
			
		||||
                                           SerializeIF::Endianness::NETWORK);
 | 
			
		||||
    if (result != returnvalue::OK) {
 | 
			
		||||
      return result;
 | 
			
		||||
    }
 | 
			
		||||
    result = SerializeAdapter::serialize(&encoderSettingsCb, payloadPtr, &serLen, FULL_PAYLOAD_SIZE,
 | 
			
		||||
                                         SerializeIF::Endianness::NETWORK);
 | 
			
		||||
    if (result != returnvalue::OK) {
 | 
			
		||||
      return result;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    result = SerializeAdapter::deSerialize(&quantizationCb, dataPtr, &deserLen,
 | 
			
		||||
                                           SerializeIF::Endianness::NETWORK);
 | 
			
		||||
    if (result != returnvalue::OK) {
 | 
			
		||||
      return result;
 | 
			
		||||
    }
 | 
			
		||||
    result = SerializeAdapter::serialize(&quantizationCb, payloadPtr, &serLen, FULL_PAYLOAD_SIZE,
 | 
			
		||||
                                         SerializeIF::Endianness::NETWORK);
 | 
			
		||||
    if (result != returnvalue::OK) {
 | 
			
		||||
      return result;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    result = SerializeAdapter::deSerialize(&encoderSettingsCr, dataPtr, &deserLen,
 | 
			
		||||
                                           SerializeIF::Endianness::NETWORK);
 | 
			
		||||
    if (result != returnvalue::OK) {
 | 
			
		||||
      return result;
 | 
			
		||||
    }
 | 
			
		||||
    result = SerializeAdapter::serialize(&encoderSettingsCr, payloadPtr, &serLen, FULL_PAYLOAD_SIZE,
 | 
			
		||||
                                         SerializeIF::Endianness::NETWORK);
 | 
			
		||||
    if (result != returnvalue::OK) {
 | 
			
		||||
      return result;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    result = SerializeAdapter::deSerialize(&quantizationCr, dataPtr, &deserLen,
 | 
			
		||||
                                           SerializeIF::Endianness::NETWORK);
 | 
			
		||||
    if (result != returnvalue::OK) {
 | 
			
		||||
      return result;
 | 
			
		||||
    }
 | 
			
		||||
    result = SerializeAdapter::serialize(&quantizationCr, payloadPtr, &serLen, FULL_PAYLOAD_SIZE,
 | 
			
		||||
                                         SerializeIF::Endianness::NETWORK);
 | 
			
		||||
    if (result != returnvalue::OK) {
 | 
			
		||||
      return result;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    result = SerializeAdapter::deSerialize(&bypassCompressor, dataPtr, &deserLen,
 | 
			
		||||
                                           SerializeIF::Endianness::NETWORK);
 | 
			
		||||
    if (result != returnvalue::OK) {
 | 
			
		||||
      return result;
 | 
			
		||||
    }
 | 
			
		||||
    result = SerializeAdapter::serialize(&bypassCompressor, payloadPtr, &serLen, FULL_PAYLOAD_SIZE,
 | 
			
		||||
                                         SerializeIF::Endianness::NETWORK);
 | 
			
		||||
    if (result != returnvalue::OK) {
 | 
			
		||||
      return result;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    spParams.setFullPayloadLen(FULL_PAYLOAD_SIZE + CRC_SIZE);
 | 
			
		||||
    return returnvalue::OK;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  std::string fileName;
 | 
			
		||||
  uint8_t encoderSettingY = 7;
 | 
			
		||||
  uint64_t quantizationY = 0;
 | 
			
		||||
  uint8_t encoderSettingsCb = 7;
 | 
			
		||||
  uint64_t quantizationCb = 0;
 | 
			
		||||
  uint8_t encoderSettingsCr = 7;
 | 
			
		||||
  uint64_t quantizationCr = 0;
 | 
			
		||||
  uint8_t bypassCompressor = 0;
 | 
			
		||||
 | 
			
		||||
 private:
 | 
			
		||||
  static const size_t PARAMETER_SIZE = 28;
 | 
			
		||||
  static constexpr size_t FULL_PAYLOAD_SIZE = FILENAME_FIELD_SIZE + PARAMETER_SIZE;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @brief   Class to build simplex send file command
 | 
			
		||||
 */
 | 
			
		||||
class TcSimplexStreamFile : public TcBase {
 | 
			
		||||
 public:
 | 
			
		||||
  TcSimplexStreamFile(ploc::SpTcParams params, uint16_t sequenceCount)
 | 
			
		||||
      : TcBase(params, apid::TC_SIMPLEX_SEND_FILE, sequenceCount) {}
 | 
			
		||||
 | 
			
		||||
  ReturnValue_t setPayload(const uint8_t* commandData, size_t commandDataLen) {
 | 
			
		||||
    if (commandDataLen > MAX_FILENAME_SIZE) {
 | 
			
		||||
      return INVALID_LENGTH;
 | 
			
		||||
    }
 | 
			
		||||
    std::string fileName(reinterpret_cast<const char*>(commandData));
 | 
			
		||||
    if (fileName.size() > MAX_FILENAME_SIZE) {
 | 
			
		||||
      return FILENAME_TOO_LONG;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    std::memset(payloadStart, 0, FILENAME_FIELD_SIZE);
 | 
			
		||||
    std::memcpy(payloadStart, fileName.data(), fileName.length());
 | 
			
		||||
    payloadStart[fileName.length()] = 0;
 | 
			
		||||
    spParams.setFullPayloadLen(FILENAME_FIELD_SIZE + CRC_SIZE);
 | 
			
		||||
    ;
 | 
			
		||||
    return returnvalue::OK;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 private:
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @brief   Class to build simplex send file command
 | 
			
		||||
 */
 | 
			
		||||
class TcSplitFile : public TcBase {
 | 
			
		||||
 public:
 | 
			
		||||
  TcSplitFile(ploc::SpTcParams params, uint16_t sequenceCount)
 | 
			
		||||
      : TcBase(params, apid::TC_SIMPLEX_SEND_FILE, sequenceCount) {}
 | 
			
		||||
 | 
			
		||||
  ReturnValue_t setPayload(const uint8_t* commandData, size_t commandDataLen) {
 | 
			
		||||
    if (commandDataLen < MIN_DATA_LENGTH) {
 | 
			
		||||
      return INVALID_LENGTH;
 | 
			
		||||
    }
 | 
			
		||||
    if (commandDataLen > MAX_DATA_LENGTH) {
 | 
			
		||||
      return INVALID_LENGTH;
 | 
			
		||||
    }
 | 
			
		||||
    const uint8_t** dataPtr = &commandData;
 | 
			
		||||
    ReturnValue_t result = SerializeAdapter::deSerialize(&chunkParameter, dataPtr, &commandDataLen,
 | 
			
		||||
                                                         SerializeIF::Endianness::NETWORK);
 | 
			
		||||
    if (result != returnvalue::OK) {
 | 
			
		||||
      return result;
 | 
			
		||||
    }
 | 
			
		||||
    /// No chunks makes no sense, and DIV str can not be longer than whats representable with 3
 | 
			
		||||
    /// decimal digits.
 | 
			
		||||
    if (chunkParameter == 0 or chunkParameter > 999) {
 | 
			
		||||
      return INVALID_PARAMETER;
 | 
			
		||||
    }
 | 
			
		||||
    std::string fileName(reinterpret_cast<const char*>(*dataPtr));
 | 
			
		||||
    if (fileName.size() > MAX_FILENAME_SIZE) {
 | 
			
		||||
    std::string fileName(reinterpret_cast<const char*>(commandData));
 | 
			
		||||
    if (fileName.size() + sizeof(NULL_TERMINATOR) > MAX_FILENAME_SIZE) {
 | 
			
		||||
      return FILENAME_TOO_LONG;
 | 
			
		||||
    }
 | 
			
		||||
    char divStr[16]{};
 | 
			
		||||
    sprintf(divStr, "DIV%03u", chunkParameter);
 | 
			
		||||
    std::memcpy(payloadStart, divStr, DIV_STR_LEN);
 | 
			
		||||
    payloadStart[DIV_STR_LEN] = 0;
 | 
			
		||||
    std::memset(payloadStart + DIV_STR_LEN + 1, 0, FILENAME_FIELD_SIZE - DIV_STR_LEN - 1);
 | 
			
		||||
    std::memcpy(payloadStart + DIV_STR_LEN + 1, fileName.data(), fileName.length());
 | 
			
		||||
    spParams.setFullPayloadLen(FILENAME_FIELD_SIZE + CRC_SIZE);
 | 
			
		||||
    if (commandDataLen - (fileName.size() + sizeof(NULL_TERMINATOR)) != PARAMETER_SIZE) {
 | 
			
		||||
      return INVALID_LENGTH;
 | 
			
		||||
    }
 | 
			
		||||
    spParams.setFullPayloadLen(commandDataLen + CRC_SIZE);
 | 
			
		||||
    std::memcpy(payloadStart, commandData, commandDataLen);
 | 
			
		||||
    return returnvalue::OK;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 private:
 | 
			
		||||
  uint32_t chunkParameter = 0;
 | 
			
		||||
  static constexpr size_t MIN_DATA_LENGTH = 4;
 | 
			
		||||
  static constexpr size_t DIV_STR_LEN = 6;
 | 
			
		||||
  static constexpr size_t MAX_DATA_LENGTH = 4 + MAX_FILENAME_SIZE;
 | 
			
		||||
  static const size_t MAX_DATA_LENGTH = 286;
 | 
			
		||||
  static const size_t PARAMETER_SIZE = 28;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @brief   Class to build simplex send file command
 | 
			
		||||
 */
 | 
			
		||||
class TcSimplexSendFile : public TcBase {
 | 
			
		||||
 public:
 | 
			
		||||
  TcSimplexSendFile(ploc::SpTcParams params, uint16_t sequenceCount)
 | 
			
		||||
      : TcBase(params, apid::TC_SIMPLEX_SEND_FILE, sequenceCount) {}
 | 
			
		||||
 | 
			
		||||
  ReturnValue_t setPayload(const uint8_t* commandData, size_t commandDataLen) {
 | 
			
		||||
    if (commandDataLen > MAX_DATA_LENGTH) {
 | 
			
		||||
      return INVALID_LENGTH;
 | 
			
		||||
    }
 | 
			
		||||
    std::string fileName(reinterpret_cast<const char*>(commandData));
 | 
			
		||||
    if (fileName.size() + sizeof(NULL_TERMINATOR) > MAX_FILENAME_SIZE) {
 | 
			
		||||
      return FILENAME_TOO_LONG;
 | 
			
		||||
    }
 | 
			
		||||
    spParams.setFullPayloadLen(commandDataLen + CRC_SIZE);
 | 
			
		||||
    std::memcpy(payloadStart, commandData, commandDataLen);
 | 
			
		||||
    return returnvalue::OK;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 private:
 | 
			
		||||
  static const size_t MAX_DATA_LENGTH = 256;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 
 | 
			
		||||
@@ -11,46 +11,13 @@
 | 
			
		||||
#include <mission/payload/plocSpBase.h>
 | 
			
		||||
 | 
			
		||||
#include <atomic>
 | 
			
		||||
#include <optional>
 | 
			
		||||
 | 
			
		||||
#include "eive/eventSubsystemIds.h"
 | 
			
		||||
#include "eive/resultClassIds.h"
 | 
			
		||||
 | 
			
		||||
namespace supv {
 | 
			
		||||
 | 
			
		||||
static constexpr bool DEBUG_PLOC_SUPV = false;
 | 
			
		||||
static constexpr bool REDUCE_NORMAL_MODE_PRINTOUT = true;
 | 
			
		||||
 | 
			
		||||
static const uint8_t SUBSYSTEM_ID = SUBSYSTEM_ID::PLOC_SUPERVISOR_HANDLER;
 | 
			
		||||
 | 
			
		||||
//! [EXPORT] : [COMMENT] PLOC supervisor crc failure in telemetry packet
 | 
			
		||||
static const Event SUPV_MEMORY_READ_RPT_CRC_FAILURE = MAKE_EVENT(1, severity::LOW);
 | 
			
		||||
//! [EXPORT] : [COMMENT] Unhandled event. P1: APID, P2: Service ID
 | 
			
		||||
static constexpr Event SUPV_UNKNOWN_TM = MAKE_EVENT(2, severity::LOW);
 | 
			
		||||
static constexpr Event SUPV_UNINIMPLEMENTED_TM = MAKE_EVENT(3, severity::LOW);
 | 
			
		||||
//! [EXPORT] : [COMMENT] PLOC supervisor received acknowledgment failure report
 | 
			
		||||
static const Event SUPV_ACK_FAILURE = MAKE_EVENT(4, severity::LOW);
 | 
			
		||||
//! [EXPORT] : [COMMENT] PLOC received execution failure report
 | 
			
		||||
//! P1: ID of command for which the execution failed
 | 
			
		||||
//! P2: Status code sent by the supervisor handler
 | 
			
		||||
static const Event SUPV_EXE_FAILURE = MAKE_EVENT(5, severity::LOW);
 | 
			
		||||
//! [EXPORT] : [COMMENT] PLOC supervisor reply has invalid crc
 | 
			
		||||
static const Event SUPV_CRC_FAILURE_EVENT = MAKE_EVENT(6, severity::LOW);
 | 
			
		||||
//! [EXPORT] : [COMMENT] Supervisor helper currently executing a command
 | 
			
		||||
static const Event SUPV_HELPER_EXECUTING = MAKE_EVENT(7, severity::LOW);
 | 
			
		||||
//! [EXPORT] : [COMMENT] Failed to build the command to shutdown the MPSoC
 | 
			
		||||
static const Event SUPV_MPSOC_SHUTDOWN_BUILD_FAILED = MAKE_EVENT(8, severity::LOW);
 | 
			
		||||
//! [EXPORT] : [COMMENT] Received ACK, but no related command is unknown or has not been sent
 | 
			
		||||
//  by this software instance. P1: Module APID. P2: Service ID.
 | 
			
		||||
static const Event SUPV_ACK_UNKNOWN_COMMAND = MAKE_EVENT(9, severity::LOW);
 | 
			
		||||
//! [EXPORT] : [COMMENT] Received ACK EXE, but no related command is unknown or has not been sent
 | 
			
		||||
//  by this software instance. P1: Module APID. P2: Service ID.
 | 
			
		||||
static const Event SUPV_EXE_ACK_UNKNOWN_COMMAND = MAKE_EVENT(10, severity::LOW);
 | 
			
		||||
 | 
			
		||||
extern std::atomic_bool SUPV_ON;
 | 
			
		||||
static constexpr uint32_t INTER_COMMAND_DELAY = 20;
 | 
			
		||||
static constexpr uint32_t BOOT_TIMEOUT_MS = 4000;
 | 
			
		||||
static constexpr uint32_t MAX_TRANSITION_TIME_TO_ON_MS = BOOT_TIMEOUT_MS + 3000;
 | 
			
		||||
static constexpr uint32_t MAX_TRANSITION_TIME_TO_OFF_MS = 1000;
 | 
			
		||||
 | 
			
		||||
namespace result {
 | 
			
		||||
static const uint8_t INTERFACE_ID = CLASS_ID::SUPV_RETURN_VALUES_IF;
 | 
			
		||||
@@ -140,7 +107,7 @@ static const DeviceCommandId_t FIRST_MRAM_DUMP = 30;
 | 
			
		||||
static const DeviceCommandId_t SET_GPIO = 34;
 | 
			
		||||
static const DeviceCommandId_t READ_GPIO = 35;
 | 
			
		||||
static const DeviceCommandId_t RESTART_SUPERVISOR = 36;
 | 
			
		||||
static const DeviceCommandId_t REQUEST_LOGGING_COUNTERS = 38;
 | 
			
		||||
static const DeviceCommandId_t LOGGING_REQUEST_COUNTERS = 38;
 | 
			
		||||
static constexpr DeviceCommandId_t FACTORY_RESET = 39;
 | 
			
		||||
static const DeviceCommandId_t CONSECUTIVE_MRAM_DUMP = 43;
 | 
			
		||||
static const DeviceCommandId_t START_MPSOC_QUIET = 45;
 | 
			
		||||
@@ -153,13 +120,12 @@ static const DeviceCommandId_t DISABLE_AUTO_TM = 51;
 | 
			
		||||
static const DeviceCommandId_t LOGGING_REQUEST_EVENT_BUFFERS = 54;
 | 
			
		||||
static const DeviceCommandId_t LOGGING_CLEAR_COUNTERS = 55;
 | 
			
		||||
static const DeviceCommandId_t LOGGING_SET_TOPIC = 56;
 | 
			
		||||
static constexpr DeviceCommandId_t REQUEST_ADC_REPORT = 57;
 | 
			
		||||
static const DeviceCommandId_t REQUEST_ADC_REPORT = 57;
 | 
			
		||||
static const DeviceCommandId_t RESET_PL = 58;
 | 
			
		||||
static const DeviceCommandId_t ENABLE_NVMS = 59;
 | 
			
		||||
static const DeviceCommandId_t CONTINUE_UPDATE = 60;
 | 
			
		||||
static const DeviceCommandId_t MEMORY_CHECK_WITH_FILE = 61;
 | 
			
		||||
static constexpr DeviceCommandId_t MEMORY_CHECK = 62;
 | 
			
		||||
static constexpr DeviceCommandId_t ABORT_LONGER_REQUEST = 63;
 | 
			
		||||
 | 
			
		||||
/** Reply IDs */
 | 
			
		||||
enum ReplyId : DeviceCommandId_t {
 | 
			
		||||
@@ -168,7 +134,7 @@ enum ReplyId : DeviceCommandId_t {
 | 
			
		||||
  HK_REPORT = 102,
 | 
			
		||||
  BOOT_STATUS_REPORT = 103,
 | 
			
		||||
  LATCHUP_REPORT = 104,
 | 
			
		||||
  COUNTERS_REPORT = 105,
 | 
			
		||||
  LOGGING_REPORT = 105,
 | 
			
		||||
  ADC_REPORT = 106,
 | 
			
		||||
  UPDATE_STATUS_REPORT = 107,
 | 
			
		||||
};
 | 
			
		||||
@@ -178,7 +144,7 @@ static const uint16_t SIZE_ACK_REPORT = 14;
 | 
			
		||||
static const uint16_t SIZE_EXE_REPORT = 14;
 | 
			
		||||
static const uint16_t SIZE_BOOT_STATUS_REPORT = 24;
 | 
			
		||||
static const uint16_t SIZE_LATCHUP_STATUS_REPORT = 31;
 | 
			
		||||
static const uint16_t SIZE_COUNTERS_REPORT = 120;
 | 
			
		||||
static const uint16_t SIZE_LOGGING_REPORT = 73;
 | 
			
		||||
static const uint16_t SIZE_ADC_REPORT = 72;
 | 
			
		||||
 | 
			
		||||
// 2 bits APID SRC, 00 for OBC, 2 bits APID DEST, 01 for SUPV, 7 bits CMD ID -> Mask 0x080
 | 
			
		||||
@@ -241,18 +207,12 @@ enum class AdcMonId : uint8_t {
 | 
			
		||||
  SET_ENABLED_CHANNELS = 0x02,
 | 
			
		||||
  SET_WINDOW_STRIDE = 0x03,
 | 
			
		||||
  SET_ADC_THRESHOLD = 0x04,
 | 
			
		||||
  COPY_ADC_DATA_TO_MRAM = 0x05,
 | 
			
		||||
  REQUEST_ADC_SAMPLE = 0x06
 | 
			
		||||
  COPY_ADC_DATA_TO_MRAM = 0x05
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum class MemManId : uint8_t { ERASE = 0x01, WRITE = 0x02, CHECK = 0x03 };
 | 
			
		||||
 | 
			
		||||
enum class DataLoggerServiceId : uint8_t {
 | 
			
		||||
  // Not implemented.
 | 
			
		||||
  READ_MRAM_CFG_DATA_LOGGER = 0x00,
 | 
			
		||||
  REQUEST_COUNTERS = 0x01,
 | 
			
		||||
  // Not implemented.
 | 
			
		||||
  EVENT_BUFFER_DOWNLOAD = 0x02,
 | 
			
		||||
  WIPE_MRAM = 0x05,
 | 
			
		||||
  DUMP_MRAM = 0x06,
 | 
			
		||||
  FACTORY_RESET = 0x07
 | 
			
		||||
@@ -271,12 +231,10 @@ enum class TmtcId : uint8_t { ACK = 0x01, NAK = 0x02, EXEC_ACK = 0x03, EXEC_NAK
 | 
			
		||||
enum class HkId : uint8_t { REPORT = 0x01, HARDFAULTS = 0x02 };
 | 
			
		||||
 | 
			
		||||
enum class BootManId : uint8_t { BOOT_STATUS_REPORT = 0x01 };
 | 
			
		||||
enum class AdcMonId : uint8_t { ADC_REPORT = 0x01 };
 | 
			
		||||
 | 
			
		||||
enum class MemManId : uint8_t { UPDATE_STATUS_REPORT = 0x01 };
 | 
			
		||||
 | 
			
		||||
enum class LatchupMonId : uint8_t { LATCHUP_STATUS_REPORT = 0x01 };
 | 
			
		||||
enum class DataLoggerId : uint8_t { COUNTERS_REPORT = 0x01 };
 | 
			
		||||
 | 
			
		||||
}  // namespace tm
 | 
			
		||||
 | 
			
		||||
@@ -363,13 +321,13 @@ static const uint16_t SEQUENCE_COUNT_MASK = 0xFFF;
 | 
			
		||||
static const uint8_t HK_SET_ENTRIES = 13;
 | 
			
		||||
static const uint8_t BOOT_REPORT_SET_ENTRIES = 10;
 | 
			
		||||
static const uint8_t LATCHUP_RPT_SET_ENTRIES = 16;
 | 
			
		||||
static const uint8_t LOGGING_RPT_SET_ENTRIES = 30;
 | 
			
		||||
static const uint8_t LOGGING_RPT_SET_ENTRIES = 16;
 | 
			
		||||
static const uint8_t ADC_RPT_SET_ENTRIES = 32;
 | 
			
		||||
 | 
			
		||||
static const uint32_t HK_SET_ID = HK_REPORT;
 | 
			
		||||
static const uint32_t BOOT_REPORT_SET_ID = BOOT_STATUS_REPORT;
 | 
			
		||||
static const uint32_t LATCHUP_RPT_ID = LATCHUP_REPORT;
 | 
			
		||||
static const uint32_t LOGGING_RPT_ID = COUNTERS_REPORT;
 | 
			
		||||
static const uint32_t LOGGING_RPT_ID = LOGGING_REPORT;
 | 
			
		||||
static const uint32_t ADC_REPORT_SET_ID = ADC_REPORT;
 | 
			
		||||
 | 
			
		||||
namespace timeout {
 | 
			
		||||
@@ -434,7 +392,7 @@ enum PoolIds : lp_id_t {
 | 
			
		||||
  BR_SOC_STATE,
 | 
			
		||||
  POWER_CYCLES,
 | 
			
		||||
  BOOT_AFTER_MS,
 | 
			
		||||
  BOOT_TIMEOUT_POOL_VAR_MS,
 | 
			
		||||
  BOOT_TIMEOUT_MS,
 | 
			
		||||
  ACTIVE_NVM,
 | 
			
		||||
  BP0_STATE,
 | 
			
		||||
  BP1_STATE,
 | 
			
		||||
@@ -459,8 +417,13 @@ enum PoolIds : lp_id_t {
 | 
			
		||||
  LATCHUP_RPT_TIME_MSEC,
 | 
			
		||||
  LATCHUP_RPT_IS_SET,
 | 
			
		||||
 | 
			
		||||
  SIGNATURE,
 | 
			
		||||
  LATCHUP_HAPPENED_CNTS,
 | 
			
		||||
  LATCHUP_HAPPENED_CNT_0,
 | 
			
		||||
  LATCHUP_HAPPENED_CNT_1,
 | 
			
		||||
  LATCHUP_HAPPENED_CNT_2,
 | 
			
		||||
  LATCHUP_HAPPENED_CNT_3,
 | 
			
		||||
  LATCHUP_HAPPENED_CNT_4,
 | 
			
		||||
  LATCHUP_HAPPENED_CNT_5,
 | 
			
		||||
  LATCHUP_HAPPENED_CNT_6,
 | 
			
		||||
  ADC_DEVIATION_TRIGGERS_CNT,
 | 
			
		||||
  TC_RECEIVED_CNT,
 | 
			
		||||
  TM_AVAILABLE_CNT,
 | 
			
		||||
@@ -469,22 +432,40 @@ enum PoolIds : lp_id_t {
 | 
			
		||||
  MPSOC_BOOT_FAILED_ATTEMPTS,
 | 
			
		||||
  MPSOC_POWER_UP,
 | 
			
		||||
  MPSOC_UPDATES,
 | 
			
		||||
  MPSOC_HEARTBEAT_RESETS,
 | 
			
		||||
  CPU_WDT_RESETS,
 | 
			
		||||
  PS_HEARTBEATS_LOST,
 | 
			
		||||
  PL_HEARTBEATS_LOST,
 | 
			
		||||
  EB_TASK_LOST,
 | 
			
		||||
  BM_TASK_LOST,
 | 
			
		||||
  LM_TASK_LOST,
 | 
			
		||||
  AM_TASK_LOST,
 | 
			
		||||
  TCTMM_TASK_LOST,
 | 
			
		||||
  MM_TASK_LOST,
 | 
			
		||||
  HK_TASK_LOST,
 | 
			
		||||
  DL_TASK_LOST,
 | 
			
		||||
  RWS_TASKS_LOST,
 | 
			
		||||
  LAST_RECVD_TC,
 | 
			
		||||
 | 
			
		||||
  ADC_RAW,
 | 
			
		||||
  ADC_ENG,
 | 
			
		||||
  ADC_RAW_0,
 | 
			
		||||
  ADC_RAW_1,
 | 
			
		||||
  ADC_RAW_2,
 | 
			
		||||
  ADC_RAW_3,
 | 
			
		||||
  ADC_RAW_4,
 | 
			
		||||
  ADC_RAW_5,
 | 
			
		||||
  ADC_RAW_6,
 | 
			
		||||
  ADC_RAW_7,
 | 
			
		||||
  ADC_RAW_8,
 | 
			
		||||
  ADC_RAW_9,
 | 
			
		||||
  ADC_RAW_10,
 | 
			
		||||
  ADC_RAW_11,
 | 
			
		||||
  ADC_RAW_12,
 | 
			
		||||
  ADC_RAW_13,
 | 
			
		||||
  ADC_RAW_14,
 | 
			
		||||
  ADC_RAW_15,
 | 
			
		||||
  ADC_ENG_0,
 | 
			
		||||
  ADC_ENG_1,
 | 
			
		||||
  ADC_ENG_2,
 | 
			
		||||
  ADC_ENG_3,
 | 
			
		||||
  ADC_ENG_4,
 | 
			
		||||
  ADC_ENG_5,
 | 
			
		||||
  ADC_ENG_6,
 | 
			
		||||
  ADC_ENG_7,
 | 
			
		||||
  ADC_ENG_8,
 | 
			
		||||
  ADC_ENG_9,
 | 
			
		||||
  ADC_ENG_10,
 | 
			
		||||
  ADC_ENG_11,
 | 
			
		||||
  ADC_ENG_12,
 | 
			
		||||
  ADC_ENG_13,
 | 
			
		||||
  ADC_ENG_14,
 | 
			
		||||
  ADC_ENG_15
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct TcParams : public ploc::SpTcParams {
 | 
			
		||||
@@ -558,6 +539,15 @@ class TmBase : public ploc::SpTmReader {
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  bool verifyCrc() {
 | 
			
		||||
    if (checkCrc() == returnvalue::OK) {
 | 
			
		||||
      crcOk = true;
 | 
			
		||||
    }
 | 
			
		||||
    return crcOk;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  bool crcIsOk() const { return crcOk; }
 | 
			
		||||
 | 
			
		||||
  uint8_t getServiceId() const { return getPacketData()[TIMESTAMP_LEN]; }
 | 
			
		||||
 | 
			
		||||
  uint16_t getModuleApid() const { return getApid() & APID_MODULE_MASK; }
 | 
			
		||||
@@ -569,6 +559,9 @@ class TmBase : public ploc::SpTmReader {
 | 
			
		||||
    }
 | 
			
		||||
    return 0;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 private:
 | 
			
		||||
  bool crcOk = false;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class NoPayloadPacket : public TcBase {
 | 
			
		||||
@@ -776,6 +769,8 @@ class SetRestartTries : public TcBase {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 private:
 | 
			
		||||
  uint8_t restartTries = 0;
 | 
			
		||||
 | 
			
		||||
  void initPacket(uint8_t restartTries) { payloadStart[0] = restartTries; }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@@ -836,6 +831,8 @@ class LatchupAlert : public TcBase {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 private:
 | 
			
		||||
  uint8_t latchupId = 0;
 | 
			
		||||
 | 
			
		||||
  void initPacket(uint8_t latchupId) { payloadStart[0] = latchupId; }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@@ -865,6 +862,9 @@ class SetAlertlimit : public TcBase {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 private:
 | 
			
		||||
  uint8_t latchupId = 0;
 | 
			
		||||
  uint32_t dutycycle = 0;
 | 
			
		||||
 | 
			
		||||
  ReturnValue_t initPacket(uint8_t latchupId, uint32_t dutycycle) {
 | 
			
		||||
    payloadStart[0] = latchupId;
 | 
			
		||||
    size_t serLen = 0;
 | 
			
		||||
@@ -1146,14 +1146,14 @@ class WriteMemory : public TcBase {
 | 
			
		||||
      : TcBase(params, Apid::MEM_MAN, static_cast<uint8_t>(tc::MemManId::WRITE), 1) {}
 | 
			
		||||
 | 
			
		||||
  ReturnValue_t buildPacket(ccsds::SequenceFlags seqFlags, uint16_t sequenceCount, uint8_t memoryId,
 | 
			
		||||
                            uint32_t currentAddr, uint16_t length, uint8_t* updateData) {
 | 
			
		||||
                            uint32_t startAddress, uint16_t length, uint8_t* updateData) {
 | 
			
		||||
    if (length > CHUNK_MAX) {
 | 
			
		||||
      sif::error << "WriteMemory::WriteMemory: Invalid length" << std::endl;
 | 
			
		||||
      return SerializeIF::BUFFER_TOO_SHORT;
 | 
			
		||||
    }
 | 
			
		||||
    spParams.creator.setSeqFlags(seqFlags);
 | 
			
		||||
    spParams.creator.setSeqCount(sequenceCount);
 | 
			
		||||
    auto res = initPacket(memoryId, currentAddr, length, updateData);
 | 
			
		||||
    auto res = initPacket(memoryId, startAddress, length, updateData);
 | 
			
		||||
    if (res != returnvalue::OK) {
 | 
			
		||||
      return res;
 | 
			
		||||
    }
 | 
			
		||||
@@ -1171,7 +1171,7 @@ class WriteMemory : public TcBase {
 | 
			
		||||
  static const uint16_t META_DATA_LENGTH = 8;
 | 
			
		||||
  uint8_t n = 1;
 | 
			
		||||
 | 
			
		||||
  ReturnValue_t initPacket(uint8_t memoryId, uint32_t currentAddr, uint16_t updateDataLen,
 | 
			
		||||
  ReturnValue_t initPacket(uint8_t memoryId, uint32_t startAddr, uint16_t updateDataLen,
 | 
			
		||||
                           uint8_t* updateData) {
 | 
			
		||||
    uint8_t* data = payloadStart;
 | 
			
		||||
    if (updateDataLen % 2 != 0) {
 | 
			
		||||
@@ -1189,7 +1189,7 @@ class WriteMemory : public TcBase {
 | 
			
		||||
                                SerializeIF::Endianness::BIG);
 | 
			
		||||
    SerializeAdapter::serialize(&n, &data, &serializedSize, spParams.maxSize,
 | 
			
		||||
                                SerializeIF::Endianness::BIG);
 | 
			
		||||
    SerializeAdapter::serialize(¤tAddr, &data, &serializedSize, spParams.maxSize,
 | 
			
		||||
    SerializeAdapter::serialize(&startAddr, &data, &serializedSize, spParams.maxSize,
 | 
			
		||||
                                SerializeIF::Endianness::BIG);
 | 
			
		||||
    SerializeAdapter::serialize(&updateDataLen, &data, &serializedSize, spParams.maxSize,
 | 
			
		||||
                                SerializeIF::Endianness::BIG);
 | 
			
		||||
@@ -1295,8 +1295,8 @@ class VerificationReport {
 | 
			
		||||
 | 
			
		||||
  virtual ~VerificationReport() = default;
 | 
			
		||||
 | 
			
		||||
  virtual ReturnValue_t parse(bool checkCrc) {
 | 
			
		||||
    if (checkCrc and readerBase.checkCrc() != returnvalue::OK) {
 | 
			
		||||
  virtual ReturnValue_t parse() {
 | 
			
		||||
    if (not readerBase.crcIsOk()) {
 | 
			
		||||
      return result::CRC_FAILURE;
 | 
			
		||||
    }
 | 
			
		||||
    if (readerBase.getModuleApid() != Apid::TMTC_MAN) {
 | 
			
		||||
@@ -1313,27 +1313,27 @@ class VerificationReport {
 | 
			
		||||
    ReturnValue_t result = SerializeAdapter::deSerialize(&refApid, &payloadStart, &remLen,
 | 
			
		||||
                                                         SerializeIF::Endianness::BIG);
 | 
			
		||||
    if (result != returnvalue::OK) {
 | 
			
		||||
      sif::warning << "VerificationReport: Failed to deserialize reference APID field" << std::endl;
 | 
			
		||||
      sif::debug << "VerificationReport: Failed to deserialize reference APID field" << std::endl;
 | 
			
		||||
      return result;
 | 
			
		||||
    }
 | 
			
		||||
    result = SerializeAdapter::deSerialize(&refServiceId, &payloadStart, &remLen,
 | 
			
		||||
                                           SerializeIF::Endianness::BIG);
 | 
			
		||||
    if (result != returnvalue::OK) {
 | 
			
		||||
      sif::warning << "VerificationReport: Failed to deserialize reference Service ID field"
 | 
			
		||||
                   << std::endl;
 | 
			
		||||
      sif::debug << "VerificationReport: Failed to deserialize reference Service ID field"
 | 
			
		||||
                 << std::endl;
 | 
			
		||||
      return result;
 | 
			
		||||
    }
 | 
			
		||||
    result = SerializeAdapter::deSerialize(&refSeqCount, &payloadStart, &remLen,
 | 
			
		||||
                                           SerializeIF::Endianness::BIG);
 | 
			
		||||
    if (result != returnvalue::OK) {
 | 
			
		||||
      sif::warning << "VerificationReport: Failed to deserialize reference sequence count field"
 | 
			
		||||
                   << std::endl;
 | 
			
		||||
      sif::debug << "VerificationReport: Failed to deserialize reference sequence count field"
 | 
			
		||||
                 << std::endl;
 | 
			
		||||
      return result;
 | 
			
		||||
    }
 | 
			
		||||
    result = SerializeAdapter::deSerialize(&statusCode, &payloadStart, &remLen,
 | 
			
		||||
                                           SerializeIF::Endianness::BIG);
 | 
			
		||||
    if (result != returnvalue::OK) {
 | 
			
		||||
      sif::warning << "VerificationReport: Failed to deserialize status code field" << std::endl;
 | 
			
		||||
      sif::debug << "VerificationReport: Failed to deserialize status code field" << std::endl;
 | 
			
		||||
      return result;
 | 
			
		||||
    }
 | 
			
		||||
    return returnvalue::OK;
 | 
			
		||||
@@ -1350,7 +1350,7 @@ class VerificationReport {
 | 
			
		||||
 | 
			
		||||
  uint32_t getStatusCode() const { return statusCode; }
 | 
			
		||||
 | 
			
		||||
  virtual void printStatusInformation(const char* prefix) const {
 | 
			
		||||
  virtual void printStatusInformation(const char* prefix) {
 | 
			
		||||
    bool codeHandled = true;
 | 
			
		||||
    if (statusCode < 0x100) {
 | 
			
		||||
      GeneralStatusCode code = static_cast<GeneralStatusCode>(getStatusCode());
 | 
			
		||||
@@ -1637,15 +1637,15 @@ class AcknowledgmentReport : public VerificationReport {
 | 
			
		||||
 public:
 | 
			
		||||
  AcknowledgmentReport(TmBase& readerBase) : VerificationReport(readerBase) {}
 | 
			
		||||
 | 
			
		||||
  ReturnValue_t parse(bool checkCrc) override {
 | 
			
		||||
  virtual ReturnValue_t parse() override {
 | 
			
		||||
    if (readerBase.getServiceId() != static_cast<uint8_t>(tm::TmtcId::ACK) and
 | 
			
		||||
        readerBase.getServiceId() != static_cast<uint8_t>(tm::TmtcId::NAK)) {
 | 
			
		||||
      return result::INVALID_SERVICE_ID;
 | 
			
		||||
    }
 | 
			
		||||
    return VerificationReport::parse(checkCrc);
 | 
			
		||||
    return VerificationReport::parse();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  void printStatusInformationAck() {
 | 
			
		||||
  void printStatusInformation() {
 | 
			
		||||
    VerificationReport::printStatusInformation(STATUS_PRINTOUT_PREFIX);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@@ -1659,15 +1659,15 @@ class ExecutionReport : public VerificationReport {
 | 
			
		||||
 | 
			
		||||
  TmBase& getReader() { return readerBase; }
 | 
			
		||||
 | 
			
		||||
  ReturnValue_t parse(bool checkCrc) override {
 | 
			
		||||
  ReturnValue_t parse() override {
 | 
			
		||||
    if (readerBase.getServiceId() != static_cast<uint8_t>(tm::TmtcId::EXEC_ACK) and
 | 
			
		||||
        readerBase.getServiceId() != static_cast<uint8_t>(tm::TmtcId::EXEC_NAK)) {
 | 
			
		||||
      return returnvalue::FAILED;
 | 
			
		||||
    }
 | 
			
		||||
    return VerificationReport::parse(checkCrc);
 | 
			
		||||
    return VerificationReport::parse();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  void printStatusInformationExe() {
 | 
			
		||||
  void printStatusInformation() {
 | 
			
		||||
    VerificationReport::printStatusInformation(STATUS_PRINTOUT_PREFIX);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@@ -1679,8 +1679,8 @@ class UpdateStatusReport {
 | 
			
		||||
 public:
 | 
			
		||||
  UpdateStatusReport(TmBase& tmReader) : tmReader(tmReader) {}
 | 
			
		||||
 | 
			
		||||
  ReturnValue_t parse(bool checkCrc) {
 | 
			
		||||
    if (checkCrc and tmReader.checkCrc() != returnvalue::OK) {
 | 
			
		||||
  ReturnValue_t parse() {
 | 
			
		||||
    if (not tmReader.crcIsOk()) {
 | 
			
		||||
      return result::CRC_FAILURE;
 | 
			
		||||
    }
 | 
			
		||||
    if (tmReader.getModuleApid() != Apid::MEM_MAN) {
 | 
			
		||||
@@ -1742,7 +1742,7 @@ class BootStatusReport : public StaticLocalDataSet<BOOT_REPORT_SET_ENTRIES> {
 | 
			
		||||
  lp_var_t<uint32_t> bootAfterMs = lp_var_t<uint32_t>(sid.objectId, PoolIds::BOOT_AFTER_MS, this);
 | 
			
		||||
  /** The currently set boot timeout */
 | 
			
		||||
  lp_var_t<uint32_t> bootTimeoutMs =
 | 
			
		||||
      lp_var_t<uint32_t>(sid.objectId, PoolIds::BOOT_TIMEOUT_POOL_VAR_MS, this);
 | 
			
		||||
      lp_var_t<uint32_t>(sid.objectId, PoolIds::BOOT_TIMEOUT_MS, this);
 | 
			
		||||
  lp_var_t<uint8_t> activeNvm = lp_var_t<uint8_t>(sid.objectId, PoolIds::ACTIVE_NVM, this);
 | 
			
		||||
  /** States of the boot partition pins */
 | 
			
		||||
  lp_var_t<uint8_t> bp0State = lp_var_t<uint8_t>(sid.objectId, PoolIds::BP0_STATE, this);
 | 
			
		||||
@@ -1806,7 +1806,7 @@ class LatchupStatusReport : public StaticLocalDataSet<LATCHUP_RPT_SET_ENTRIES> {
 | 
			
		||||
  lp_var_t<uint8_t> timeMon = lp_var_t<uint8_t>(sid.objectId, PoolIds::LATCHUP_RPT_TIME_MON, this);
 | 
			
		||||
  lp_var_t<uint8_t> timeYear =
 | 
			
		||||
      lp_var_t<uint8_t>(sid.objectId, PoolIds::LATCHUP_RPT_TIME_YEAR, this);
 | 
			
		||||
  lp_var_t<uint8_t> isSynced = lp_var_t<uint8_t>(sid.objectId, PoolIds::LATCHUP_RPT_IS_SET, this);
 | 
			
		||||
  lp_var_t<uint8_t> isSet = lp_var_t<uint8_t>(sid.objectId, PoolIds::LATCHUP_RPT_IS_SET, this);
 | 
			
		||||
 | 
			
		||||
  static const uint8_t IS_SET_BIT_POS = 15;
 | 
			
		||||
};
 | 
			
		||||
@@ -1814,16 +1814,26 @@ class LatchupStatusReport : public StaticLocalDataSet<LATCHUP_RPT_SET_ENTRIES> {
 | 
			
		||||
/**
 | 
			
		||||
 * @brief   This dataset stores the logging report.
 | 
			
		||||
 */
 | 
			
		||||
class CountersReport : public StaticLocalDataSet<LOGGING_RPT_SET_ENTRIES> {
 | 
			
		||||
class LoggingReport : public StaticLocalDataSet<LOGGING_RPT_SET_ENTRIES> {
 | 
			
		||||
 public:
 | 
			
		||||
  CountersReport(HasLocalDataPoolIF* owner) : StaticLocalDataSet(owner, LOGGING_RPT_ID) {}
 | 
			
		||||
  LoggingReport(HasLocalDataPoolIF* owner) : StaticLocalDataSet(owner, LOGGING_RPT_ID) {}
 | 
			
		||||
 | 
			
		||||
  CountersReport(object_id_t objectId) : StaticLocalDataSet(sid_t(objectId, LOGGING_RPT_ID)) {}
 | 
			
		||||
  LoggingReport(object_id_t objectId) : StaticLocalDataSet(sid_t(objectId, LOGGING_RPT_ID)) {}
 | 
			
		||||
 | 
			
		||||
  lp_var_t<uint32_t> signature =
 | 
			
		||||
      lp_var_t<uint32_t>(sid.objectId, PoolIds::LATCHUP_HAPPENED_CNTS, this);
 | 
			
		||||
  lp_vec_t<uint32_t, 7> latchupHappenCnts =
 | 
			
		||||
      lp_vec_t<uint32_t, 7>(sid.objectId, PoolIds::LATCHUP_HAPPENED_CNTS, this);
 | 
			
		||||
  lp_var_t<uint32_t> latchupHappenCnt0 =
 | 
			
		||||
      lp_var_t<uint32_t>(sid.objectId, PoolIds::LATCHUP_HAPPENED_CNT_0, this);
 | 
			
		||||
  lp_var_t<uint32_t> latchupHappenCnt1 =
 | 
			
		||||
      lp_var_t<uint32_t>(sid.objectId, PoolIds::LATCHUP_HAPPENED_CNT_1, this);
 | 
			
		||||
  lp_var_t<uint32_t> latchupHappenCnt2 =
 | 
			
		||||
      lp_var_t<uint32_t>(sid.objectId, PoolIds::LATCHUP_HAPPENED_CNT_2, this);
 | 
			
		||||
  lp_var_t<uint32_t> latchupHappenCnt3 =
 | 
			
		||||
      lp_var_t<uint32_t>(sid.objectId, PoolIds::LATCHUP_HAPPENED_CNT_3, this);
 | 
			
		||||
  lp_var_t<uint32_t> latchupHappenCnt4 =
 | 
			
		||||
      lp_var_t<uint32_t>(sid.objectId, PoolIds::LATCHUP_HAPPENED_CNT_4, this);
 | 
			
		||||
  lp_var_t<uint32_t> latchupHappenCnt5 =
 | 
			
		||||
      lp_var_t<uint32_t>(sid.objectId, PoolIds::LATCHUP_HAPPENED_CNT_5, this);
 | 
			
		||||
  lp_var_t<uint32_t> latchupHappenCnt6 =
 | 
			
		||||
      lp_var_t<uint32_t>(sid.objectId, PoolIds::LATCHUP_HAPPENED_CNT_6, this);
 | 
			
		||||
  lp_var_t<uint32_t> adcDeviationTriggersCnt =
 | 
			
		||||
      lp_var_t<uint32_t>(sid.objectId, PoolIds::ADC_DEVIATION_TRIGGERS_CNT, this);
 | 
			
		||||
  lp_var_t<uint32_t> tcReceivedCnt =
 | 
			
		||||
@@ -1837,31 +1847,23 @@ class CountersReport : public StaticLocalDataSet<LOGGING_RPT_SET_ENTRIES> {
 | 
			
		||||
      lp_var_t<uint32_t>(sid.objectId, PoolIds::MPSOC_BOOT_FAILED_ATTEMPTS, this);
 | 
			
		||||
  lp_var_t<uint32_t> mpsocPowerup = lp_var_t<uint32_t>(sid.objectId, PoolIds::MPSOC_POWER_UP, this);
 | 
			
		||||
  lp_var_t<uint32_t> mpsocUpdates = lp_var_t<uint32_t>(sid.objectId, PoolIds::MPSOC_UPDATES, this);
 | 
			
		||||
  lp_var_t<uint32_t> mpsocHeartbeatResets =
 | 
			
		||||
      lp_var_t<uint32_t>(sid.objectId, PoolIds::MPSOC_HEARTBEAT_RESETS, this);
 | 
			
		||||
  lp_var_t<uint32_t> cpuWdtResets =
 | 
			
		||||
      lp_var_t<uint32_t>(sid.objectId, PoolIds::MPSOC_HEARTBEAT_RESETS, this);
 | 
			
		||||
  lp_var_t<uint32_t> psHeartbeatsLost =
 | 
			
		||||
      lp_var_t<uint32_t>(sid.objectId, PoolIds::PS_HEARTBEATS_LOST, this);
 | 
			
		||||
  lp_var_t<uint32_t> plHeartbeatsLost =
 | 
			
		||||
      lp_var_t<uint32_t>(sid.objectId, PoolIds::PL_HEARTBEATS_LOST, this);
 | 
			
		||||
  lp_var_t<uint32_t> ebTaskLost = lp_var_t<uint32_t>(sid.objectId, PoolIds::EB_TASK_LOST, this);
 | 
			
		||||
  lp_var_t<uint32_t> bmTaskLost = lp_var_t<uint32_t>(sid.objectId, PoolIds::BM_TASK_LOST, this);
 | 
			
		||||
  lp_var_t<uint32_t> lmTaskLost = lp_var_t<uint32_t>(sid.objectId, PoolIds::LM_TASK_LOST, this);
 | 
			
		||||
  lp_var_t<uint32_t> amTaskLost = lp_var_t<uint32_t>(sid.objectId, PoolIds::AM_TASK_LOST, this);
 | 
			
		||||
  lp_var_t<uint32_t> tctmmTaskLost =
 | 
			
		||||
      lp_var_t<uint32_t>(sid.objectId, PoolIds::TCTMM_TASK_LOST, this);
 | 
			
		||||
  lp_var_t<uint32_t> mmTaskLost = lp_var_t<uint32_t>(sid.objectId, PoolIds::MM_TASK_LOST, this);
 | 
			
		||||
  lp_var_t<uint32_t> hkTaskLost = lp_var_t<uint32_t>(sid.objectId, PoolIds::HK_TASK_LOST, this);
 | 
			
		||||
  lp_var_t<uint32_t> dlTaskLost = lp_var_t<uint32_t>(sid.objectId, PoolIds::DL_TASK_LOST, this);
 | 
			
		||||
  lp_vec_t<uint32_t, 3> rwsTasksLost =
 | 
			
		||||
      lp_vec_t<uint32_t, 3>(sid.objectId, PoolIds::RWS_TASKS_LOST, this);
 | 
			
		||||
  lp_var_t<uint32_t> lastRecvdTc = lp_var_t<uint32_t>(sid.objectId, PoolIds::LAST_RECVD_TC, this);
 | 
			
		||||
 | 
			
		||||
  void printSet() {
 | 
			
		||||
    for (unsigned i = 0; i < 7; i++) {
 | 
			
		||||
      sif::info << "LoggingReport: Latchup happened count " << i << ": "
 | 
			
		||||
                << this->latchupHappenCnts[i] << std::endl;
 | 
			
		||||
    }
 | 
			
		||||
    sif::info << "LoggingReport: Latchup happened count 0: " << this->latchupHappenCnt0
 | 
			
		||||
              << std::endl;
 | 
			
		||||
    sif::info << "LoggingReport: Latchup happened count 1: " << this->latchupHappenCnt1
 | 
			
		||||
              << std::endl;
 | 
			
		||||
    sif::info << "LoggingReport: Latchup happened count 2: " << this->latchupHappenCnt2
 | 
			
		||||
              << std::endl;
 | 
			
		||||
    sif::info << "LoggingReport: Latchup happened count 3: " << this->latchupHappenCnt3
 | 
			
		||||
              << std::endl;
 | 
			
		||||
    sif::info << "LoggingReport: Latchup happened count 4: " << this->latchupHappenCnt4
 | 
			
		||||
              << std::endl;
 | 
			
		||||
    sif::info << "LoggingReport: Latchup happened count 5: " << this->latchupHappenCnt5
 | 
			
		||||
              << std::endl;
 | 
			
		||||
    sif::info << "LoggingReport: Latchup happened count 6: " << this->latchupHappenCnt6
 | 
			
		||||
              << std::endl;
 | 
			
		||||
    sif::info << "LoggingReport: ADC deviation triggers count: " << this->adcDeviationTriggersCnt
 | 
			
		||||
              << std::endl;
 | 
			
		||||
    sif::info << "LoggingReport: TC received count: " << this->tcReceivedCnt << std::endl;
 | 
			
		||||
@@ -1872,29 +1874,88 @@ class CountersReport : public StaticLocalDataSet<LOGGING_RPT_SET_ENTRIES> {
 | 
			
		||||
              << std::endl;
 | 
			
		||||
    sif::info << "LoggingReport: MPSoC power up: " << this->mpsocPowerup << std::endl;
 | 
			
		||||
    sif::info << "LoggingReport: MPSoC updates: " << this->mpsocUpdates << std::endl;
 | 
			
		||||
    sif::info << "LoggingReport: APID of last received TC: 0x" << std::hex << this->lastRecvdTc
 | 
			
		||||
              << std::endl;
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @brief   This dataset stores the ADC report.
 | 
			
		||||
 */
 | 
			
		||||
class AdcReport : public StaticLocalDataSet<3> {
 | 
			
		||||
class AdcReport : public StaticLocalDataSet<ADC_RPT_SET_ENTRIES> {
 | 
			
		||||
 public:
 | 
			
		||||
  AdcReport(HasLocalDataPoolIF* owner) : StaticLocalDataSet(owner, ADC_REPORT_SET_ID) {}
 | 
			
		||||
 | 
			
		||||
  AdcReport(object_id_t objectId) : StaticLocalDataSet(sid_t(objectId, ADC_REPORT_SET_ID)) {}
 | 
			
		||||
 | 
			
		||||
  lp_vec_t<uint16_t, 16> adcRaw = lp_vec_t<uint16_t, 16>(sid.objectId, PoolIds::ADC_RAW, this);
 | 
			
		||||
  lp_vec_t<uint16_t, 16> adcEng = lp_vec_t<uint16_t, 16>(sid.objectId, PoolIds::ADC_ENG, this);
 | 
			
		||||
  lp_var_t<uint16_t> adcRaw0 = lp_var_t<uint16_t>(sid.objectId, PoolIds::ADC_RAW_0, this);
 | 
			
		||||
  lp_var_t<uint16_t> adcRaw1 = lp_var_t<uint16_t>(sid.objectId, PoolIds::ADC_RAW_1, this);
 | 
			
		||||
  lp_var_t<uint16_t> adcRaw2 = lp_var_t<uint16_t>(sid.objectId, PoolIds::ADC_RAW_2, this);
 | 
			
		||||
  lp_var_t<uint16_t> adcRaw3 = lp_var_t<uint16_t>(sid.objectId, PoolIds::ADC_RAW_3, this);
 | 
			
		||||
  lp_var_t<uint16_t> adcRaw4 = lp_var_t<uint16_t>(sid.objectId, PoolIds::ADC_RAW_4, this);
 | 
			
		||||
  lp_var_t<uint16_t> adcRaw5 = lp_var_t<uint16_t>(sid.objectId, PoolIds::ADC_RAW_5, this);
 | 
			
		||||
  lp_var_t<uint16_t> adcRaw6 = lp_var_t<uint16_t>(sid.objectId, PoolIds::ADC_RAW_6, this);
 | 
			
		||||
  lp_var_t<uint16_t> adcRaw7 = lp_var_t<uint16_t>(sid.objectId, PoolIds::ADC_RAW_7, this);
 | 
			
		||||
  lp_var_t<uint16_t> adcRaw8 = lp_var_t<uint16_t>(sid.objectId, PoolIds::ADC_RAW_8, this);
 | 
			
		||||
  lp_var_t<uint16_t> adcRaw9 = lp_var_t<uint16_t>(sid.objectId, PoolIds::ADC_RAW_9, this);
 | 
			
		||||
  lp_var_t<uint16_t> adcRaw10 = lp_var_t<uint16_t>(sid.objectId, PoolIds::ADC_RAW_10, this);
 | 
			
		||||
  lp_var_t<uint16_t> adcRaw11 = lp_var_t<uint16_t>(sid.objectId, PoolIds::ADC_RAW_11, this);
 | 
			
		||||
  lp_var_t<uint16_t> adcRaw12 = lp_var_t<uint16_t>(sid.objectId, PoolIds::ADC_RAW_12, this);
 | 
			
		||||
  lp_var_t<uint16_t> adcRaw13 = lp_var_t<uint16_t>(sid.objectId, PoolIds::ADC_RAW_13, this);
 | 
			
		||||
  lp_var_t<uint16_t> adcRaw14 = lp_var_t<uint16_t>(sid.objectId, PoolIds::ADC_RAW_14, this);
 | 
			
		||||
  lp_var_t<uint16_t> adcRaw15 = lp_var_t<uint16_t>(sid.objectId, PoolIds::ADC_RAW_15, this);
 | 
			
		||||
  lp_var_t<uint16_t> adcEng0 = lp_var_t<uint16_t>(sid.objectId, PoolIds::ADC_ENG_0, this);
 | 
			
		||||
  lp_var_t<uint16_t> adcEng1 = lp_var_t<uint16_t>(sid.objectId, PoolIds::ADC_ENG_1, this);
 | 
			
		||||
  lp_var_t<uint16_t> adcEng2 = lp_var_t<uint16_t>(sid.objectId, PoolIds::ADC_ENG_2, this);
 | 
			
		||||
  lp_var_t<uint16_t> adcEng3 = lp_var_t<uint16_t>(sid.objectId, PoolIds::ADC_ENG_3, this);
 | 
			
		||||
  lp_var_t<uint16_t> adcEng4 = lp_var_t<uint16_t>(sid.objectId, PoolIds::ADC_ENG_4, this);
 | 
			
		||||
  lp_var_t<uint16_t> adcEng5 = lp_var_t<uint16_t>(sid.objectId, PoolIds::ADC_ENG_5, this);
 | 
			
		||||
  lp_var_t<uint16_t> adcEng6 = lp_var_t<uint16_t>(sid.objectId, PoolIds::ADC_ENG_6, this);
 | 
			
		||||
  lp_var_t<uint16_t> adcEng7 = lp_var_t<uint16_t>(sid.objectId, PoolIds::ADC_ENG_7, this);
 | 
			
		||||
  lp_var_t<uint16_t> adcEng8 = lp_var_t<uint16_t>(sid.objectId, PoolIds::ADC_ENG_8, this);
 | 
			
		||||
  lp_var_t<uint16_t> adcEng9 = lp_var_t<uint16_t>(sid.objectId, PoolIds::ADC_ENG_9, this);
 | 
			
		||||
  lp_var_t<uint16_t> adcEng10 = lp_var_t<uint16_t>(sid.objectId, PoolIds::ADC_ENG_10, this);
 | 
			
		||||
  lp_var_t<uint16_t> adcEng11 = lp_var_t<uint16_t>(sid.objectId, PoolIds::ADC_ENG_11, this);
 | 
			
		||||
  lp_var_t<uint16_t> adcEng12 = lp_var_t<uint16_t>(sid.objectId, PoolIds::ADC_ENG_12, this);
 | 
			
		||||
  lp_var_t<uint16_t> adcEng13 = lp_var_t<uint16_t>(sid.objectId, PoolIds::ADC_ENG_13, this);
 | 
			
		||||
  lp_var_t<uint16_t> adcEng14 = lp_var_t<uint16_t>(sid.objectId, PoolIds::ADC_ENG_14, this);
 | 
			
		||||
  lp_var_t<uint16_t> adcEng15 = lp_var_t<uint16_t>(sid.objectId, PoolIds::ADC_ENG_15, this);
 | 
			
		||||
 | 
			
		||||
  void printSet() {
 | 
			
		||||
    sif::info << "---- Adc Report: Raw values ----" << std::endl;
 | 
			
		||||
    for (unsigned i = 0; i < 16; i++) {
 | 
			
		||||
      sif::info << "AdcReport: ADC raw " << i << ": " << std::dec << this->adcRaw[i] << std::endl;
 | 
			
		||||
    }
 | 
			
		||||
    for (unsigned i = 0; i < 16; i++) {
 | 
			
		||||
      sif::info << "AdcReport: ADC eng " << i << ": " << std::dec << this->adcEng[i] << std::endl;
 | 
			
		||||
    }
 | 
			
		||||
    sif::info << "AdcReport: ADC raw 0: " << std::dec << this->adcRaw0 << std::endl;
 | 
			
		||||
    sif::info << "AdcReport: ADC raw 1: " << this->adcRaw1 << std::endl;
 | 
			
		||||
    sif::info << "AdcReport: ADC raw 2: " << this->adcRaw2 << std::endl;
 | 
			
		||||
    sif::info << "AdcReport: ADC raw 3: " << this->adcRaw3 << std::endl;
 | 
			
		||||
    sif::info << "AdcReport: ADC raw 4: " << this->adcRaw4 << std::endl;
 | 
			
		||||
    sif::info << "AdcReport: ADC raw 5: " << this->adcRaw5 << std::endl;
 | 
			
		||||
    sif::info << "AdcReport: ADC raw 6: " << this->adcRaw6 << std::endl;
 | 
			
		||||
    sif::info << "AdcReport: ADC raw 7: " << this->adcRaw7 << std::endl;
 | 
			
		||||
    sif::info << "AdcReport: ADC raw 8: " << this->adcRaw8 << std::endl;
 | 
			
		||||
    sif::info << "AdcReport: ADC raw 9: " << this->adcRaw9 << std::endl;
 | 
			
		||||
    sif::info << "AdcReport: ADC raw 10: " << this->adcRaw10 << std::endl;
 | 
			
		||||
    sif::info << "AdcReport: ADC raw 11: " << this->adcRaw11 << std::endl;
 | 
			
		||||
    sif::info << "AdcReport: ADC raw 12: " << this->adcRaw12 << std::endl;
 | 
			
		||||
    sif::info << "AdcReport: ADC raw 13: " << this->adcRaw13 << std::endl;
 | 
			
		||||
    sif::info << "AdcReport: ADC raw 14: " << this->adcRaw14 << std::endl;
 | 
			
		||||
    sif::info << "AdcReport: ADC raw 15: " << this->adcRaw15 << std::endl;
 | 
			
		||||
    sif::info << "---- Adc Report: Engineering values ----" << std::endl;
 | 
			
		||||
    sif::info << "AdcReport: ADC eng 0: " << this->adcEng0 << std::endl;
 | 
			
		||||
    sif::info << "AdcReport: ADC eng 1: " << this->adcEng1 << std::endl;
 | 
			
		||||
    sif::info << "AdcReport: ADC eng 2: " << this->adcEng2 << std::endl;
 | 
			
		||||
    sif::info << "AdcReport: ADC eng 3: " << this->adcEng3 << std::endl;
 | 
			
		||||
    sif::info << "AdcReport: ADC eng 4: " << this->adcEng4 << std::endl;
 | 
			
		||||
    sif::info << "AdcReport: ADC eng 5: " << this->adcEng5 << std::endl;
 | 
			
		||||
    sif::info << "AdcReport: ADC eng 6: " << this->adcEng6 << std::endl;
 | 
			
		||||
    sif::info << "AdcReport: ADC eng 7: " << this->adcEng7 << std::endl;
 | 
			
		||||
    sif::info << "AdcReport: ADC eng 8: " << this->adcEng8 << std::endl;
 | 
			
		||||
    sif::info << "AdcReport: ADC eng 9: " << this->adcEng9 << std::endl;
 | 
			
		||||
    sif::info << "AdcReport: ADC eng 10: " << this->adcEng10 << std::endl;
 | 
			
		||||
    sif::info << "AdcReport: ADC eng 11: " << this->adcEng11 << std::endl;
 | 
			
		||||
    sif::info << "AdcReport: ADC eng 12: " << this->adcEng12 << std::endl;
 | 
			
		||||
    sif::info << "AdcReport: ADC eng 13: " << this->adcEng13 << std::endl;
 | 
			
		||||
    sif::info << "AdcReport: ADC eng 14: " << this->adcEng14 << std::endl;
 | 
			
		||||
    sif::info << "AdcReport: ADC eng 15: " << this->adcEng15 << std::endl;
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@@ -1984,7 +2045,11 @@ class EnableNvms : public TcBase {
 | 
			
		||||
 */
 | 
			
		||||
class EnableAutoTm : public TcBase {
 | 
			
		||||
 public:
 | 
			
		||||
  EnableAutoTm(TcParams params) : TcBase(params) { spParams.setFullPayloadLen(PAYLOAD_LENGTH + 2); }
 | 
			
		||||
  EnableAutoTm(TcParams params) : TcBase(params) {
 | 
			
		||||
    spParams.setFullPayloadLen(PAYLOAD_LENGTH + 2);
 | 
			
		||||
    // spParams.creator.setApid(APID_AUTO_TM);
 | 
			
		||||
    // spParams.creator.setSeqCount(DEFAULT_SEQUENCE_COUNT);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  ReturnValue_t buildPacket() {
 | 
			
		||||
    auto res = checkSizeAndSerializeHeader();
 | 
			
		||||
 
 | 
			
		||||
@@ -53,7 +53,7 @@ class CspComIF : public DeviceCommunicationIF, public SystemObject {
 | 
			
		||||
 | 
			
		||||
  typedef uint8_t node_t;
 | 
			
		||||
  struct ReplyInfo {
 | 
			
		||||
    ReplyInfo(size_t maxLen) : replyBuf(maxLen) {};
 | 
			
		||||
    ReplyInfo(size_t maxLen) : replyBuf(maxLen){};
 | 
			
		||||
    std::vector<uint8_t> replyBuf;
 | 
			
		||||
    size_t replyLen = 0;
 | 
			
		||||
  };
 | 
			
		||||
 
 | 
			
		||||
@@ -47,3 +47,35 @@ void scheduling::addMpsocSupvHandlers(PeriodicTaskIF* plTask) {
 | 
			
		||||
  plTask->addComponent(objects::PLOC_MPSOC_HANDLER, DeviceHandlerIF::SEND_READ);
 | 
			
		||||
  plTask->addComponent(objects::PLOC_MPSOC_HANDLER, DeviceHandlerIF::GET_READ);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void scheduling::scheduleScexDev(PeriodicTaskIF*& scexDevHandler) {
 | 
			
		||||
  ReturnValue_t result =
 | 
			
		||||
      scexDevHandler->addComponent(objects::SCEX, DeviceHandlerIF::PERFORM_OPERATION);
 | 
			
		||||
  if (result != returnvalue::OK) {
 | 
			
		||||
    printAddObjectError("SCEX_DEV", objects::SCEX);
 | 
			
		||||
  }
 | 
			
		||||
  result = scexDevHandler->addComponent(objects::SCEX, DeviceHandlerIF::SEND_WRITE);
 | 
			
		||||
  if (result != returnvalue::OK) {
 | 
			
		||||
    printAddObjectError("SCEX_DEV", objects::SCEX);
 | 
			
		||||
  }
 | 
			
		||||
  result = scexDevHandler->addComponent(objects::SCEX, DeviceHandlerIF::GET_WRITE);
 | 
			
		||||
  if (result != returnvalue::OK) {
 | 
			
		||||
    printAddObjectError("SCEX_DEV", objects::SCEX);
 | 
			
		||||
  }
 | 
			
		||||
  result = scexDevHandler->addComponent(objects::SCEX, DeviceHandlerIF::SEND_READ);
 | 
			
		||||
  if (result != returnvalue::OK) {
 | 
			
		||||
    printAddObjectError("SCEX_DEV", objects::SCEX);
 | 
			
		||||
  }
 | 
			
		||||
  result = scexDevHandler->addComponent(objects::SCEX, DeviceHandlerIF::GET_READ);
 | 
			
		||||
  if (result != returnvalue::OK) {
 | 
			
		||||
    printAddObjectError("SCEX_DEV", objects::SCEX);
 | 
			
		||||
  }
 | 
			
		||||
  result = scexDevHandler->addComponent(objects::SCEX, DeviceHandlerIF::SEND_READ);
 | 
			
		||||
  if (result != returnvalue::OK) {
 | 
			
		||||
    printAddObjectError("SCEX_DEV", objects::SCEX);
 | 
			
		||||
  }
 | 
			
		||||
  result = scexDevHandler->addComponent(objects::SCEX, DeviceHandlerIF::GET_READ);
 | 
			
		||||
  if (result != returnvalue::OK) {
 | 
			
		||||
    printAddObjectError("SCEX_DEV", objects::SCEX);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -8,6 +8,7 @@ namespace scheduling {
 | 
			
		||||
extern PosixThreadArgs RR_SCHEDULING;
 | 
			
		||||
extern PosixThreadArgs NORMAL_SCHEDULING;
 | 
			
		||||
 | 
			
		||||
void scheduleScexDev(PeriodicTaskIF*& scexDevHandler);
 | 
			
		||||
void scheduleScexReader(TaskFactory& factory, PeriodicTaskIF*& scexReaderTask);
 | 
			
		||||
void addMpsocSupvHandlers(PeriodicTaskIF* task);
 | 
			
		||||
}  // namespace scheduling
 | 
			
		||||
 
 | 
			
		||||
@@ -12,7 +12,7 @@
 | 
			
		||||
#include "fsfw/devicehandlers/DeviceCommunicationIF.h"
 | 
			
		||||
 | 
			
		||||
struct Max31865ReaderCookie : public CookieIF {
 | 
			
		||||
  Max31865ReaderCookie() {};
 | 
			
		||||
  Max31865ReaderCookie(){};
 | 
			
		||||
  Max31865ReaderCookie(object_id_t handlerId_, uint8_t idx_, const std::string& locString_,
 | 
			
		||||
                       SpiCookie* spiCookie_)
 | 
			
		||||
      : idx(idx_), handlerId(handlerId_), locString(locString_), spiCookie(spiCookie_) {}
 | 
			
		||||
 
 | 
			
		||||
@@ -795,9 +795,9 @@ ReturnValue_t ImtqHandler::initializeLocalDataPool(localpool::DataPool& localDat
 | 
			
		||||
  localDataPoolMap.emplace(imtq::FINA_NEG_Z_COIL_Z_TEMPERATURE, new PoolEntry<int16_t>({0}));
 | 
			
		||||
 | 
			
		||||
  poolManager.subscribeForDiagPeriodicPacket(
 | 
			
		||||
      subdp::DiagnosticsHkPeriodicParams(hkDatasetNoTorque.getSid(), enableHkSets, 60.0));
 | 
			
		||||
      subdp::DiagnosticsHkPeriodicParams(hkDatasetNoTorque.getSid(), enableHkSets, 30.0));
 | 
			
		||||
  poolManager.subscribeForDiagPeriodicPacket(
 | 
			
		||||
      subdp::DiagnosticsHkPeriodicParams(hkDatasetWithTorque.getSid(), enableHkSets, 60.0));
 | 
			
		||||
      subdp::DiagnosticsHkPeriodicParams(hkDatasetWithTorque.getSid(), enableHkSets, 30.0));
 | 
			
		||||
  poolManager.subscribeForDiagPeriodicPacket(
 | 
			
		||||
      subdp::DiagnosticsHkPeriodicParams(rawMtmNoTorque.getSid(), false, 10.0));
 | 
			
		||||
  poolManager.subscribeForDiagPeriodicPacket(
 | 
			
		||||
 
 | 
			
		||||
@@ -340,7 +340,7 @@ ReturnValue_t RwHandler::initializeLocalDataPool(localpool::DataPool& localDataP
 | 
			
		||||
  localDataPoolMap.emplace(rws::SPI_REG_OVERRUN_ERRORS, new PoolEntry<uint32_t>({0}));
 | 
			
		||||
  localDataPoolMap.emplace(rws::SPI_TOTAL_ERRORS, new PoolEntry<uint32_t>({0}));
 | 
			
		||||
  poolManager.subscribeForDiagPeriodicPacket(
 | 
			
		||||
      subdp::DiagnosticsHkPeriodicParams(statusSet.getSid(), false, 30.0));
 | 
			
		||||
      subdp::DiagnosticsHkPeriodicParams(statusSet.getSid(), false, 12.0));
 | 
			
		||||
  poolManager.subscribeForRegularPeriodicPacket(
 | 
			
		||||
      subdp::RegularHkPeriodicParams(tmDataset.getSid(), false, 30.0));
 | 
			
		||||
  poolManager.subscribeForRegularPeriodicPacket(
 | 
			
		||||
 
 | 
			
		||||
@@ -59,7 +59,6 @@ class RwHandler : public DeviceHandlerBase {
 | 
			
		||||
  LocalPoolDataSetBase* getDataSetHandle(sid_t sid) override;
 | 
			
		||||
 | 
			
		||||
 private:
 | 
			
		||||
  static const uint8_t INTERFACE_ID = CLASS_ID::RW_HANDLER;
 | 
			
		||||
  //! [EXPORT] : [COMMENT] Action Message with invalid speed was received. Valid speeds must be in
 | 
			
		||||
  //! the range of [-65000; 1000] or [1000; 65000]
 | 
			
		||||
  static const ReturnValue_t INVALID_SPEED = MAKE_RETURN_CODE(0xA0);
 | 
			
		||||
 
 | 
			
		||||
@@ -7,19 +7,15 @@
 | 
			
		||||
 | 
			
		||||
namespace GpsHyperion {
 | 
			
		||||
 | 
			
		||||
enum FixMode : uint8_t { NOT_SEEN = 0, NO_FIX = 1, FIX_2D = 2, FIX_3D = 3 };
 | 
			
		||||
 | 
			
		||||
enum GnssChip : uint8_t { A_SIDE = 0, B_SIDE = 1 };
 | 
			
		||||
enum class FixMode : uint8_t { NOT_SEEN = 0, NO_FIX = 1, FIX_2D = 2, FIX_3D = 3, UNKNOWN = 4 };
 | 
			
		||||
 | 
			
		||||
static constexpr uint8_t SUBSYSTEM_ID = SUBSYSTEM_ID::GPS_HANDLER;
 | 
			
		||||
//! [EXPORT] : [COMMENT] Fix has changed. P1: New fix. P2: Missed fix changes
 | 
			
		||||
//! [EXPORT] : [COMMENT] Fix has changed. P1: Old fix. P2: New fix
 | 
			
		||||
//! 0: Not seen, 1: No Fix, 2: 2D-Fix, 3: 3D-Fix
 | 
			
		||||
static constexpr Event GPS_FIX_CHANGE = event::makeEvent(SUBSYSTEM_ID, 0, severity::INFO);
 | 
			
		||||
//! [EXPORT] : [COMMENT] Could not get fix in maximum allowed time. Trying to reset both GNSS
 | 
			
		||||
//! devices. P1: Maximum allowed time to get a fix after the GPS was switched on.
 | 
			
		||||
static constexpr Event CANT_GET_FIX = event::makeEvent(SUBSYSTEM_ID, 1, severity::MEDIUM);
 | 
			
		||||
//! [EXPORT] : [COMMENT] Failed to reset an GNNS Device. P1: Board-Side.
 | 
			
		||||
static constexpr Event RESET_FAIL = event::makeEvent(SUBSYSTEM_ID, 2, severity::HIGH);
 | 
			
		||||
//! [EXPORT] : [COMMENT] Could not get fix in maximum allowed time. P1: Maximum allowed time
 | 
			
		||||
//! to get a fix after the GPS was switched on.
 | 
			
		||||
static constexpr Event CANT_GET_FIX = event::makeEvent(SUBSYSTEM_ID, 1, severity::LOW);
 | 
			
		||||
 | 
			
		||||
static constexpr DeviceCommandId_t GPS_REPLY = 0;
 | 
			
		||||
static constexpr DeviceCommandId_t TRIGGER_RESET_PIN_GNSS = 5;
 | 
			
		||||
@@ -57,6 +53,8 @@ static constexpr uint8_t SKYVIEW_ENTRIES = 6;
 | 
			
		||||
 | 
			
		||||
static constexpr uint8_t MAX_SATELLITES = 30;
 | 
			
		||||
 | 
			
		||||
enum GpsFixModes : uint8_t { INVALID = 0, NO_FIX = 1, FIX_2D = 2, FIX_3D = 3 };
 | 
			
		||||
 | 
			
		||||
}  // namespace GpsHyperion
 | 
			
		||||
 | 
			
		||||
class GpsPrimaryDataset : public StaticLocalDataSet<GpsHyperion::CORE_DATASET_ENTRIES> {
 | 
			
		||||
@@ -22,10 +22,10 @@ enum AcsMode : Mode_t {
 | 
			
		||||
 | 
			
		||||
enum SafeSubmode : Submode_t { DEFAULT = 0, DETUMBLE = 1 };
 | 
			
		||||
 | 
			
		||||
enum ControlModeStrategy : uint8_t {
 | 
			
		||||
  CTRL_OFF = 0,
 | 
			
		||||
  CTRL_NO_MAG_FIELD_FOR_CONTROL = 1,
 | 
			
		||||
  CTRL_NO_SENSORS_FOR_CONTROL = 2,
 | 
			
		||||
enum SafeModeStrategy : uint8_t {
 | 
			
		||||
  SAFECTRL_OFF = 0,
 | 
			
		||||
  SAFECTRL_NO_MAG_FIELD_FOR_CONTROL = 1,
 | 
			
		||||
  SAFECTRL_NO_SENSORS_FOR_CONTROL = 2,
 | 
			
		||||
  // OBSW version <= v6.1.0
 | 
			
		||||
  LEGACY_SAFECTRL_ACTIVE_MEKF = 10,
 | 
			
		||||
  LEGACY_SAFECTRL_WITHOUT_MEKF = 11,
 | 
			
		||||
@@ -40,39 +40,20 @@ enum ControlModeStrategy : uint8_t {
 | 
			
		||||
  SAFECTRL_ECLIPSE_IDELING = 19,
 | 
			
		||||
  SAFECTRL_DETUMBLE_FULL = 20,
 | 
			
		||||
  SAFECTRL_DETUMBLE_DETERIORATED = 21,
 | 
			
		||||
  // Added in vNext
 | 
			
		||||
  PTGCTRL_MEKF = 100,
 | 
			
		||||
  PTGCTRL_STR = 101,
 | 
			
		||||
  PTGCTRL_QUEST = 102,
 | 
			
		||||
};
 | 
			
		||||
namespace gps {
 | 
			
		||||
enum Source : uint8_t {
 | 
			
		||||
 | 
			
		||||
enum GpsSource : uint8_t {
 | 
			
		||||
  NONE,
 | 
			
		||||
  GPS,
 | 
			
		||||
  GPS_EXTRAPOLATED,
 | 
			
		||||
  SPG4,
 | 
			
		||||
};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
namespace rotrate {
 | 
			
		||||
enum Source : uint8_t {
 | 
			
		||||
  NONE,
 | 
			
		||||
  SUSMGM,
 | 
			
		||||
  QUEST,
 | 
			
		||||
  STR,
 | 
			
		||||
};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static const uint8_t SUBSYSTEM_ID = SUBSYSTEM_ID::ACS_SUBSYSTEM;
 | 
			
		||||
//! [EXPORT] : [COMMENT] The limits for the rotation in safe mode were violated.
 | 
			
		||||
static constexpr Event SAFE_RATE_VIOLATION = MAKE_EVENT(0, severity::MEDIUM);
 | 
			
		||||
//! [EXPORT] : [COMMENT] The limits for the rotation in pointing mode were violated.
 | 
			
		||||
static constexpr Event PTG_RATE_VIOLATION = MAKE_EVENT(10, severity::MEDIUM);
 | 
			
		||||
//! [EXPORT] : [COMMENT] The system has recovered from a rate rotation violation.
 | 
			
		||||
static constexpr Event RATE_RECOVERY = MAKE_EVENT(1, severity::MEDIUM);
 | 
			
		||||
//! [EXPORT] : [COMMENT] The detumble transition has failed.
 | 
			
		||||
//! //! P1: Last detumble state before failure.
 | 
			
		||||
static constexpr Event DETUMBLE_TRANSITION_FAILED = MAKE_EVENT(11, severity::HIGH);
 | 
			
		||||
//! [EXPORT] : [COMMENT] The system has recovered from a safe rate rotation violation.
 | 
			
		||||
static constexpr Event SAFE_RATE_RECOVERY = MAKE_EVENT(1, severity::MEDIUM);
 | 
			
		||||
//! [EXPORT] : [COMMENT] Multiple RWs are invalid, uncommandable and therefore higher ACS modes
 | 
			
		||||
//! cannot be maintained.
 | 
			
		||||
static constexpr Event MULTIPLE_RW_INVALID = MAKE_EVENT(2, severity::HIGH);
 | 
			
		||||
@@ -83,17 +64,15 @@ static constexpr Event MEKF_INVALID_INFO = MAKE_EVENT(3, severity::INFO);
 | 
			
		||||
static constexpr Event MEKF_RECOVERY = MAKE_EVENT(4, severity::INFO);
 | 
			
		||||
//! [EXPORT] : [COMMENT] MEKF performed an automatic reset after detection of nonfinite values.
 | 
			
		||||
static constexpr Event MEKF_AUTOMATIC_RESET = MAKE_EVENT(5, severity::INFO);
 | 
			
		||||
//! [EXPORT] : [COMMENT] For a prolonged time, no attitude information was available for the
 | 
			
		||||
//! Pointing Controller. Falling back to Safe Mode.
 | 
			
		||||
static constexpr Event PTG_CTRL_NO_ATTITUDE_INFORMATION = MAKE_EVENT(6, severity::HIGH);
 | 
			
		||||
//! [EXPORT] : [COMMENT] MEKF was not able to compute a solution during any pointing ACS mode for a
 | 
			
		||||
//! prolonged time.
 | 
			
		||||
static constexpr Event MEKF_INVALID_MODE_VIOLATION = MAKE_EVENT(6, severity::HIGH);
 | 
			
		||||
//! [EXPORT] : [COMMENT] The ACS safe mode controller was not able to compute a solution and has
 | 
			
		||||
//! failed.
 | 
			
		||||
//! P1: Missing information about magnetic field, P2: Missing information about rotational rate
 | 
			
		||||
static constexpr Event SAFE_MODE_CONTROLLER_FAILURE = MAKE_EVENT(7, severity::HIGH);
 | 
			
		||||
//! [EXPORT] : [COMMENT] The TLE for the SGP4 Propagator has become too old.
 | 
			
		||||
static constexpr Event TLE_TOO_OLD = MAKE_EVENT(8, severity::INFO);
 | 
			
		||||
//! [EXPORT] : [COMMENT] The TLE could not be read from the filesystem.
 | 
			
		||||
static constexpr Event TLE_FILE_READ_FAILED = MAKE_EVENT(9, severity::LOW);
 | 
			
		||||
 | 
			
		||||
extern const char* getModeStr(AcsMode mode);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -32,7 +32,7 @@ ReturnValue_t ArcsecDatalinkLayer::checkRingBufForFrame(const uint8_t** decodedF
 | 
			
		||||
    size_t encodedDataSize = 0;
 | 
			
		||||
    slip_error_t slipError =
 | 
			
		||||
        slip_decode_frame(decodedRxFrame, &rxFrameSize, rxAnalysisBuffer + startIdx,
 | 
			
		||||
                          idx - startIdx + 1, &encodedDataSize, ARC_DEF_SAGITTA_SLIP_ID, 0);
 | 
			
		||||
                          idx - startIdx + 1, &encodedDataSize, ARC_DEF_SAGITTA_SLIP_ID);
 | 
			
		||||
    decodeRingBuf.deleteData(idx + 1);
 | 
			
		||||
    switch (slipError) {
 | 
			
		||||
      case (SLIP_OK): {
 | 
			
		||||
@@ -76,7 +76,7 @@ void ArcsecDatalinkLayer::reset() { decodeRingBuf.clear(); }
 | 
			
		||||
 | 
			
		||||
void ArcsecDatalinkLayer::encodeFrame(const uint8_t* data, size_t length, const uint8_t** txFrame,
 | 
			
		||||
                                      size_t& size) {
 | 
			
		||||
  slip_encode_frame(data, length, txEncoded, sizeof(txEncoded), &size, ARC_DEF_SAGITTA_SLIP_ID);
 | 
			
		||||
  slip_encode_frame(data, length, txEncoded, &size, ARC_DEF_SAGITTA_SLIP_ID);
 | 
			
		||||
  if (txFrame != nullptr) {
 | 
			
		||||
    *txFrame = txEncoded;
 | 
			
		||||
  }
 | 
			
		||||
 
 | 
			
		||||
@@ -65,7 +65,7 @@ void ArcsecJsonParamBase::addSetParamHeader(uint8_t* buffer, uint8_t setId) {
 | 
			
		||||
  *(buffer + 1) = setId;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ReturnValue_t ArcsecJsonParamBase::init(const std::string& filename) {
 | 
			
		||||
ReturnValue_t ArcsecJsonParamBase::init(const std::string filename) {
 | 
			
		||||
  ReturnValue_t result = returnvalue::OK;
 | 
			
		||||
  if (not std::filesystem::exists(filename)) {
 | 
			
		||||
    sif::warning << "ArcsecJsonParamBase::init: JSON file " << filename << " does not exist"
 | 
			
		||||
 
 | 
			
		||||
@@ -46,7 +46,7 @@ class ArcsecJsonParamBase {
 | 
			
		||||
   * @param return    JSON_FILE_NOT_EXISTS if specified file does not exist, otherwise
 | 
			
		||||
   *                  returnvalue::OK
 | 
			
		||||
   */
 | 
			
		||||
  ReturnValue_t init(const std::string& filename);
 | 
			
		||||
  ReturnValue_t init(const std::string filename);
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @brief   Fills a buffer with a parameter set
 | 
			
		||||
 
 | 
			
		||||
@@ -5,13 +5,6 @@
 | 
			
		||||
#include <mission/acs/str/strHelpers.h>
 | 
			
		||||
#include <mission/acs/str/strJsonCommands.h>
 | 
			
		||||
 | 
			
		||||
#include <string>
 | 
			
		||||
 | 
			
		||||
#include "fsfw/filesystem/HasFileSystemIF.h"
 | 
			
		||||
#include "fsfw/ipc/MessageQueueIF.h"
 | 
			
		||||
#include "fsfw/returnvalues/returnvalue.h"
 | 
			
		||||
#include "mission/memory/SdCardMountedIF.h"
 | 
			
		||||
 | 
			
		||||
extern "C" {
 | 
			
		||||
#include <sagitta/client/actionreq.h>
 | 
			
		||||
#include <sagitta/client/client_tm_structs.h>
 | 
			
		||||
@@ -21,6 +14,7 @@ extern "C" {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#include <atomic>
 | 
			
		||||
#include <fstream>
 | 
			
		||||
#include <thread>
 | 
			
		||||
 | 
			
		||||
#include "OBSWConfig.h"
 | 
			
		||||
@@ -30,9 +24,8 @@ extern "C" {
 | 
			
		||||
std::atomic_bool JCFG_DONE(false);
 | 
			
		||||
 | 
			
		||||
StarTrackerHandler::StarTrackerHandler(object_id_t objectId, object_id_t comIF, CookieIF* comCookie,
 | 
			
		||||
                                       StrComHandler* strHelper, power::Switch_t powerSwitch,
 | 
			
		||||
                                       startracker::SdCardConfigPathGetter& cfgPathGetter,
 | 
			
		||||
                                       SdCardMountedIF& sdCardIF)
 | 
			
		||||
                                       const char* jsonFileStr, StrComHandler* strHelper,
 | 
			
		||||
                                       power::Switch_t powerSwitch)
 | 
			
		||||
    : DeviceHandlerBase(objectId, comIF, comCookie),
 | 
			
		||||
      temperatureSet(this),
 | 
			
		||||
      versionSet(this),
 | 
			
		||||
@@ -63,11 +56,9 @@ StarTrackerHandler::StarTrackerHandler(object_id_t objectId, object_id_t comIF,
 | 
			
		||||
      centroidSet(this),
 | 
			
		||||
      centroidsSet(this),
 | 
			
		||||
      contrastSet(this),
 | 
			
		||||
      blobStatsSet(this),
 | 
			
		||||
      strHelper(strHelper),
 | 
			
		||||
      powerSwitch(powerSwitch),
 | 
			
		||||
      sdCardIF(sdCardIF),
 | 
			
		||||
      cfgPathGetter(cfgPathGetter) {
 | 
			
		||||
      paramJsonFile(jsonFileStr),
 | 
			
		||||
      powerSwitch(powerSwitch) {
 | 
			
		||||
  if (comCookie == nullptr) {
 | 
			
		||||
    sif::error << "StarTrackerHandler: Invalid com cookie" << std::endl;
 | 
			
		||||
  }
 | 
			
		||||
@@ -91,12 +82,17 @@ void StarTrackerHandler::doStartUp() {
 | 
			
		||||
      // the device handler's submode to the star tracker's mode
 | 
			
		||||
      return;
 | 
			
		||||
    case StartupState::DONE:
 | 
			
		||||
      if (!JCFG_DONE) {
 | 
			
		||||
      if (jcfgCountdown.isBusy()) {
 | 
			
		||||
        startupState = StartupState::WAIT_JCFG;
 | 
			
		||||
        return;
 | 
			
		||||
      }
 | 
			
		||||
      startupState = StartupState::IDLE;
 | 
			
		||||
      break;
 | 
			
		||||
    case StartupState::WAIT_JCFG: {
 | 
			
		||||
      if (jcfgCountdown.hasTimedOut()) {
 | 
			
		||||
        startupState = StartupState::IDLE;
 | 
			
		||||
        break;
 | 
			
		||||
      }
 | 
			
		||||
      return;
 | 
			
		||||
    }
 | 
			
		||||
    default:
 | 
			
		||||
@@ -143,10 +139,8 @@ ReturnValue_t StarTrackerHandler::initialize() {
 | 
			
		||||
 | 
			
		||||
  // Spin up a thread to do the JSON initialization, takes 200-250 ms which would
 | 
			
		||||
  // delay whole satellite boot process.
 | 
			
		||||
  reloadJsonCfgFile();
 | 
			
		||||
 | 
			
		||||
  // Default firmware target is always initialized from persistent file.
 | 
			
		||||
  loadTargetFirmwareFromPersistentCfg();
 | 
			
		||||
  jcfgCountdown.resetTimer();
 | 
			
		||||
  jsonCfgTask = std::thread{setUpJsonCfgs, std::ref(jcfgs), paramJsonFile.c_str()};
 | 
			
		||||
 | 
			
		||||
  EventManagerIF* manager = ObjectManager::instance()->get<EventManagerIF>(objects::EVENT_MANAGER);
 | 
			
		||||
  if (manager == nullptr) {
 | 
			
		||||
@@ -175,33 +169,6 @@ ReturnValue_t StarTrackerHandler::initialize() {
 | 
			
		||||
  return returnvalue::OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void StarTrackerHandler::loadTargetFirmwareFromPersistentCfg() {
 | 
			
		||||
  const char* prefix = sdCardIF.getCurrentMountPrefix();
 | 
			
		||||
  std::filesystem::path path = std::filesystem::path(prefix) / startracker::FW_TARGET_CFG_PATH;
 | 
			
		||||
  std::ifstream ifile(path);
 | 
			
		||||
  if (ifile.is_open() and !ifile.bad()) {
 | 
			
		||||
    std::string targetStr;
 | 
			
		||||
    std::getline(ifile, targetStr);
 | 
			
		||||
    if (targetStr == "backup") {
 | 
			
		||||
      firmwareTargetRaw = static_cast<uint8_t>(startracker::FirmwareTarget::BACKUP);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool StarTrackerHandler::reloadJsonCfgFile() {
 | 
			
		||||
  jcfgCountdown.resetTimer();
 | 
			
		||||
  auto strCfgPath = cfgPathGetter.getCfgPath();
 | 
			
		||||
  if (strCfgPath.has_value()) {
 | 
			
		||||
    jcfgPending = true;
 | 
			
		||||
    JCFG_DONE = false;
 | 
			
		||||
    jsonCfgTask = std::thread{setUpJsonCfgs, std::ref(jcfgs), strCfgPath.value()};
 | 
			
		||||
    return true;
 | 
			
		||||
  }
 | 
			
		||||
  // Simplified FDIR: Just continue as usual..
 | 
			
		||||
  JCFG_DONE = true;
 | 
			
		||||
  return false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ReturnValue_t StarTrackerHandler::executeAction(ActionId_t actionId, MessageQueueId_t commandedBy,
 | 
			
		||||
                                                const uint8_t* data, size_t size) {
 | 
			
		||||
  ReturnValue_t result = returnvalue::OK;
 | 
			
		||||
@@ -330,11 +297,21 @@ ReturnValue_t StarTrackerHandler::executeAction(ActionId_t actionId, MessageQueu
 | 
			
		||||
      strHelper->setFlashReadFilename(std::string(reinterpret_cast<const char*>(data), size));
 | 
			
		||||
      return EXECUTION_FINISHED;
 | 
			
		||||
    }
 | 
			
		||||
    case (startracker::FIRMWARE_UPDATE_MAIN): {
 | 
			
		||||
      return handleFirmwareUpdateCommand(data, size, startracker::FirmwareTarget::MAIN);
 | 
			
		||||
    }
 | 
			
		||||
    case (startracker::FIRMWARE_UPDATE_BACKUP): {
 | 
			
		||||
      return handleFirmwareUpdateCommand(data, size, startracker::FirmwareTarget::BACKUP);
 | 
			
		||||
    case (startracker::FIRMWARE_UPDATE): {
 | 
			
		||||
      result = DeviceHandlerBase::acceptExternalDeviceCommands();
 | 
			
		||||
      if (result != returnvalue::OK) {
 | 
			
		||||
        return result;
 | 
			
		||||
      }
 | 
			
		||||
      if (size > config::MAX_PATH_SIZE + config::MAX_FILENAME_SIZE) {
 | 
			
		||||
        return FILE_PATH_TOO_LONG;
 | 
			
		||||
      }
 | 
			
		||||
      result =
 | 
			
		||||
          strHelper->startFirmwareUpdate(std::string(reinterpret_cast<const char*>(data), size));
 | 
			
		||||
      if (result != returnvalue::OK) {
 | 
			
		||||
        return result;
 | 
			
		||||
      }
 | 
			
		||||
      strHelperHandlingSpecialRequest = true;
 | 
			
		||||
      return EXECUTION_FINISHED;
 | 
			
		||||
    }
 | 
			
		||||
    default:
 | 
			
		||||
      break;
 | 
			
		||||
@@ -343,23 +320,6 @@ ReturnValue_t StarTrackerHandler::executeAction(ActionId_t actionId, MessageQueu
 | 
			
		||||
  reinitNextSetParam = true;
 | 
			
		||||
  return DeviceHandlerBase::executeAction(actionId, commandedBy, data, size);
 | 
			
		||||
}
 | 
			
		||||
ReturnValue_t StarTrackerHandler::handleFirmwareUpdateCommand(const uint8_t* data, size_t size,
 | 
			
		||||
                                                              startracker::FirmwareTarget target) {
 | 
			
		||||
  ReturnValue_t result = DeviceHandlerBase::acceptExternalDeviceCommands();
 | 
			
		||||
  if (result != returnvalue::OK) {
 | 
			
		||||
    return result;
 | 
			
		||||
  }
 | 
			
		||||
  if (size > config::MAX_PATH_SIZE + config::MAX_FILENAME_SIZE) {
 | 
			
		||||
    return FILE_PATH_TOO_LONG;
 | 
			
		||||
  }
 | 
			
		||||
  result = strHelper->startFirmwareUpdate(std::string(reinterpret_cast<const char*>(data), size),
 | 
			
		||||
                                          target);
 | 
			
		||||
  if (result != returnvalue::OK) {
 | 
			
		||||
    return result;
 | 
			
		||||
  }
 | 
			
		||||
  strHelperHandlingSpecialRequest = true;
 | 
			
		||||
  return EXECUTION_FINISHED;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void StarTrackerHandler::performOperationHook() {
 | 
			
		||||
  EventMessage event;
 | 
			
		||||
@@ -375,24 +335,6 @@ void StarTrackerHandler::performOperationHook() {
 | 
			
		||||
        break;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  if (jcfgPending) {
 | 
			
		||||
    if (JCFG_DONE) {
 | 
			
		||||
      if (startupState == StartupState::WAIT_JCFG) {
 | 
			
		||||
        startupState = StartupState::DONE;
 | 
			
		||||
      }
 | 
			
		||||
      jsonCfgTask.join();
 | 
			
		||||
      jcfgPending = false;
 | 
			
		||||
      auto iter = deviceCommandMap.find(startracker::RELOAD_JSON_CFG_FILE);
 | 
			
		||||
      if (iter != deviceCommandMap.end() and iter->second.sendReplyTo != MessageQueueIF::NO_QUEUE) {
 | 
			
		||||
        actionHelper.finish(true, iter->second.sendReplyTo, startracker::RELOAD_JSON_CFG_FILE);
 | 
			
		||||
      }
 | 
			
		||||
    } else if (jcfgCountdown.hasTimedOut()) {
 | 
			
		||||
      auto iter = deviceCommandMap.find(startracker::RELOAD_JSON_CFG_FILE);
 | 
			
		||||
      if (iter != deviceCommandMap.end() and iter->second.sendReplyTo != MessageQueueIF::NO_QUEUE) {
 | 
			
		||||
        actionHelper.finish(false, iter->second.sendReplyTo, startracker::RELOAD_JSON_CFG_FILE);
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Submode_t StarTrackerHandler::getInitialSubmode() { return startracker::SUBMODE_BOOTLOADER; }
 | 
			
		||||
@@ -557,23 +499,13 @@ ReturnValue_t StarTrackerHandler::buildCommandFromCommand(DeviceCommandId_t devi
 | 
			
		||||
      preparePingRequest();
 | 
			
		||||
      return returnvalue::OK;
 | 
			
		||||
    }
 | 
			
		||||
    case (startracker::RELOAD_JSON_CFG_FILE): {
 | 
			
		||||
      if (jcfgPending) {
 | 
			
		||||
        return HasActionsIF::IS_BUSY;
 | 
			
		||||
      }
 | 
			
		||||
      // It should be noted that this just reloads the JSON config structure in memory from the
 | 
			
		||||
      // JSON file. The configuration still needs to be sent to the STR. The easiest way to achieve
 | 
			
		||||
      // this is to simply reboot the device after a reload.
 | 
			
		||||
      reloadJsonCfgFile();
 | 
			
		||||
      return returnvalue::OK;
 | 
			
		||||
    }
 | 
			
		||||
    case (startracker::SET_TIME_FROM_SYS_TIME): {
 | 
			
		||||
      SetTimeActionRequest setTimeRequest{};
 | 
			
		||||
      timeval tv;
 | 
			
		||||
      Clock::getClock(&tv);
 | 
			
		||||
      setTimeRequest.unixTime =
 | 
			
		||||
          (static_cast<uint64_t>(tv.tv_sec) * 1000 * 1000) + (static_cast<uint64_t>(tv.tv_usec));
 | 
			
		||||
      prv_arc_pack_settime_action_req(&setTimeRequest, commandBuffer, &rawPacketLen);
 | 
			
		||||
      arc_pack_settime_action_req(&setTimeRequest, commandBuffer, &rawPacketLen);
 | 
			
		||||
      size_t serLen = 0;
 | 
			
		||||
      // Time in milliseconds. Manual serialization because arcsec API ignores endianness.
 | 
			
		||||
      SerializeAdapter::serialize(&setTimeRequest.unixTime, commandBuffer + 2, &serLen,
 | 
			
		||||
@@ -581,7 +513,6 @@ ReturnValue_t StarTrackerHandler::buildCommandFromCommand(DeviceCommandId_t devi
 | 
			
		||||
      rawPacket = commandBuffer;
 | 
			
		||||
      return returnvalue::OK;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    case (startracker::REQ_TIME): {
 | 
			
		||||
      prepareTimeRequest();
 | 
			
		||||
      return returnvalue::OK;
 | 
			
		||||
@@ -598,12 +529,8 @@ ReturnValue_t StarTrackerHandler::buildCommandFromCommand(DeviceCommandId_t devi
 | 
			
		||||
      prepareRequestContrastTm();
 | 
			
		||||
      return returnvalue::OK;
 | 
			
		||||
    }
 | 
			
		||||
    case (startracker::REQ_BLOB_STATS): {
 | 
			
		||||
      prepareRequestBlobStatsTm();
 | 
			
		||||
      return returnvalue::OK;
 | 
			
		||||
    }
 | 
			
		||||
    case (startracker::BOOT): {
 | 
			
		||||
      prepareBootCommand(static_cast<startracker::FirmwareTarget>(firmwareTargetRaw));
 | 
			
		||||
      prepareBootCommand();
 | 
			
		||||
      return returnvalue::OK;
 | 
			
		||||
    }
 | 
			
		||||
    case (startracker::REQ_VERSION): {
 | 
			
		||||
@@ -799,7 +726,6 @@ void StarTrackerHandler::fillCommandAndReplyMap() {
 | 
			
		||||
                                   startracker::MAX_FRAME_SIZE * 2 + 2);
 | 
			
		||||
  this->insertInCommandMap(startracker::UPLOAD_IMAGE);
 | 
			
		||||
  this->insertInCommandMap(startracker::DOWNLOAD_IMAGE);
 | 
			
		||||
  this->insertInCommandMap(startracker::RELOAD_JSON_CFG_FILE);
 | 
			
		||||
  this->insertInCommandAndReplyMap(startracker::REQ_POWER, 3, &powerSet,
 | 
			
		||||
                                   startracker::MAX_FRAME_SIZE * 2 + 2);
 | 
			
		||||
  this->insertInCommandAndReplyMap(startracker::REQ_INTERFACE, 3, &interfaceSet,
 | 
			
		||||
@@ -890,8 +816,6 @@ void StarTrackerHandler::fillCommandAndReplyMap() {
 | 
			
		||||
                                   startracker::MAX_FRAME_SIZE * 2 + 2);
 | 
			
		||||
  this->insertInCommandAndReplyMap(startracker::REQ_CONTRAST, 3, &contrastSet,
 | 
			
		||||
                                   startracker::MAX_FRAME_SIZE * 2 + 2);
 | 
			
		||||
  this->insertInCommandAndReplyMap(startracker::REQ_BLOB_STATS, 3, &blobStatsSet,
 | 
			
		||||
                                   startracker::MAX_FRAME_SIZE * 2 + 2);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ReturnValue_t StarTrackerHandler::isModeCombinationValid(Mode_t mode, Submode_t submode) {
 | 
			
		||||
@@ -1004,7 +928,7 @@ void StarTrackerHandler::bootFirmware(Mode_t toMode) {
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void StarTrackerHandler::setUpJsonCfgs(JsonConfigs& cfgs, std::string paramJsonFile) {
 | 
			
		||||
void StarTrackerHandler::setUpJsonCfgs(JsonConfigs& cfgs, const char* paramJsonFile) {
 | 
			
		||||
  cfgs.tracking.init(paramJsonFile);
 | 
			
		||||
  cfgs.logLevel.init(paramJsonFile);
 | 
			
		||||
  cfgs.logSubscription.init(paramJsonFile);
 | 
			
		||||
@@ -1089,12 +1013,6 @@ void StarTrackerHandler::resetSecondaryTmSet() {
 | 
			
		||||
      histogramSet.setValidity(false, true);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  {
 | 
			
		||||
    PoolReadGuard pg(&blobStatsSet);
 | 
			
		||||
    if (pg.getReadResult() == returnvalue::OK) {
 | 
			
		||||
      histogramSet.setValidity(false, true);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void StarTrackerHandler::bootBootloader() {
 | 
			
		||||
@@ -1204,7 +1122,7 @@ ReturnValue_t StarTrackerHandler::interpretDeviceReply(DeviceCommandId_t id,
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
    case (startracker::REQ_SOLUTION): {
 | 
			
		||||
      result = handleSolution(packet);
 | 
			
		||||
      result = handleTm(packet, solutionSet, "REQ_SOLUTION");
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
    case (startracker::REQ_CONTRAST): {
 | 
			
		||||
@@ -1243,10 +1161,6 @@ ReturnValue_t StarTrackerHandler::interpretDeviceReply(DeviceCommandId_t id,
 | 
			
		||||
      result = handleTm(packet, histogramSet, "REQ_HISTO");
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
    case (startracker::REQ_BLOB_STATS): {
 | 
			
		||||
      result = handleTm(packet, blobStatsSet, "REQ_BLOB_STATS");
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
    case (startracker::SUBSCRIPTION):
 | 
			
		||||
    case (startracker::LOGLEVEL):
 | 
			
		||||
    case (startracker::LOGSUBSCRIPTION):
 | 
			
		||||
@@ -1648,13 +1562,6 @@ ReturnValue_t StarTrackerHandler::initializeLocalDataPool(localpool::DataPool& l
 | 
			
		||||
  localDataPoolMap.emplace(startracker::PoolIds::CONTRAST_C, new PoolEntry<uint32_t>(9));
 | 
			
		||||
  localDataPoolMap.emplace(startracker::PoolIds::CONTRAST_D, new PoolEntry<uint32_t>(9));
 | 
			
		||||
 | 
			
		||||
  localDataPoolMap.emplace(startracker::TICKS_BLOB_STATS, new PoolEntry<uint32_t>());
 | 
			
		||||
  localDataPoolMap.emplace(startracker::TIME_BLOB_STATS, new PoolEntry<uint64_t>());
 | 
			
		||||
  localDataPoolMap.emplace(startracker::PoolIds::BLOB_STATS_NOISE, new PoolEntry<uint8_t>(16));
 | 
			
		||||
  localDataPoolMap.emplace(startracker::PoolIds::BLOB_STATS_THOLD, new PoolEntry<uint8_t>(16));
 | 
			
		||||
  localDataPoolMap.emplace(startracker::PoolIds::BLOB_STATS_LVALID, new PoolEntry<uint8_t>(16));
 | 
			
		||||
  localDataPoolMap.emplace(startracker::PoolIds::BLOB_STATS_OFLOW, new PoolEntry<uint8_t>(16));
 | 
			
		||||
 | 
			
		||||
  poolManager.subscribeForDiagPeriodicPacket(
 | 
			
		||||
      subdp::DiagnosticsHkPeriodicParams(temperatureSet.getSid(), false, 10.0));
 | 
			
		||||
  poolManager.subscribeForRegularPeriodicPacket(
 | 
			
		||||
@@ -1662,7 +1569,7 @@ ReturnValue_t StarTrackerHandler::initializeLocalDataPool(localpool::DataPool& l
 | 
			
		||||
  poolManager.subscribeForRegularPeriodicPacket(
 | 
			
		||||
      subdp::RegularHkPeriodicParams(interfaceSet.getSid(), false, 10.0));
 | 
			
		||||
  poolManager.subscribeForDiagPeriodicPacket(
 | 
			
		||||
      subdp::DiagnosticsHkPeriodicParams(solutionSet.getSid(), false, 30.0));
 | 
			
		||||
      subdp::DiagnosticsHkPeriodicParams(solutionSet.getSid(), false, 12.0));
 | 
			
		||||
  poolManager.subscribeForRegularPeriodicPacket(
 | 
			
		||||
      subdp::RegularHkPeriodicParams(cameraSet.getSid(), false, 10.0));
 | 
			
		||||
  poolManager.subscribeForRegularPeriodicPacket(
 | 
			
		||||
@@ -1683,8 +1590,6 @@ ReturnValue_t StarTrackerHandler::initializeLocalDataPool(localpool::DataPool& l
 | 
			
		||||
      subdp::RegularHkPeriodicParams(centroidsSet.getSid(), false, 10.0));
 | 
			
		||||
  poolManager.subscribeForRegularPeriodicPacket(
 | 
			
		||||
      subdp::RegularHkPeriodicParams(contrastSet.getSid(), false, 10.0));
 | 
			
		||||
  poolManager.subscribeForRegularPeriodicPacket(
 | 
			
		||||
      subdp::RegularHkPeriodicParams(blobStatsSet.getSid(), false, 10.0));
 | 
			
		||||
  return returnvalue::OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -1714,8 +1619,7 @@ ReturnValue_t StarTrackerHandler::checkMode(ActionId_t actionId) {
 | 
			
		||||
    case startracker::UPLOAD_IMAGE:
 | 
			
		||||
    case startracker::DOWNLOAD_IMAGE:
 | 
			
		||||
    case startracker::FLASH_READ:
 | 
			
		||||
    case startracker::FIRMWARE_UPDATE_BACKUP:
 | 
			
		||||
    case startracker::FIRMWARE_UPDATE_MAIN: {
 | 
			
		||||
    case startracker::FIRMWARE_UPDATE: {
 | 
			
		||||
      return DeviceHandlerBase::acceptExternalDeviceCommands();
 | 
			
		||||
      default:
 | 
			
		||||
        break;
 | 
			
		||||
@@ -1931,10 +1835,6 @@ ReturnValue_t StarTrackerHandler::scanForTmReply(uint8_t replyId, DeviceCommandI
 | 
			
		||||
      *foundId = startracker::REQ_BLOB;
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
    case (startracker::ID::BLOB_STATS): {
 | 
			
		||||
      *foundId = startracker::REQ_BLOB_STATS;
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
    case (startracker::ID::BLOBS): {
 | 
			
		||||
      *foundId = startracker::REQ_BLOBS;
 | 
			
		||||
      break;
 | 
			
		||||
@@ -2016,10 +1916,10 @@ ReturnValue_t StarTrackerHandler::executeFlashReadCommand(const uint8_t* command
 | 
			
		||||
  return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void StarTrackerHandler::prepareBootCommand(startracker::FirmwareTarget target) {
 | 
			
		||||
void StarTrackerHandler::prepareBootCommand() {
 | 
			
		||||
  uint32_t length = 0;
 | 
			
		||||
  struct BootActionRequest bootRequest = {static_cast<uint8_t>(target)};
 | 
			
		||||
  prv_arc_pack_boot_action_req(&bootRequest, commandBuffer, &length);
 | 
			
		||||
  struct BootActionRequest bootRequest = {BOOT_REGION_ID};
 | 
			
		||||
  arc_pack_boot_action_req(&bootRequest, commandBuffer, &length);
 | 
			
		||||
  rawPacket = commandBuffer;
 | 
			
		||||
  rawPacketLen = length;
 | 
			
		||||
}
 | 
			
		||||
@@ -2052,7 +1952,7 @@ ReturnValue_t StarTrackerHandler::prepareChecksumCommand(const uint8_t* commandD
 | 
			
		||||
    return result;
 | 
			
		||||
  }
 | 
			
		||||
  uint32_t rawCmdLength = 0;
 | 
			
		||||
  prv_arc_pack_checksum_action_req(&req, commandBuffer, &rawCmdLength);
 | 
			
		||||
  arc_pack_checksum_action_req(&req, commandBuffer, &rawCmdLength);
 | 
			
		||||
  rawPacket = commandBuffer;
 | 
			
		||||
  rawPacketLen = rawCmdLength;
 | 
			
		||||
  checksumCmd.rememberRegion = req.region;
 | 
			
		||||
@@ -2071,7 +1971,7 @@ void StarTrackerHandler::prepareTimeRequest() {
 | 
			
		||||
void StarTrackerHandler::preparePingRequest() {
 | 
			
		||||
  uint32_t length = 0;
 | 
			
		||||
  struct PingActionRequest pingRequest = {PING_ID};
 | 
			
		||||
  prv_arc_pack_ping_action_req(&pingRequest, commandBuffer, &length);
 | 
			
		||||
  arc_pack_ping_action_req(&pingRequest, commandBuffer, &length);
 | 
			
		||||
  rawPacket = commandBuffer;
 | 
			
		||||
  rawPacketLen = length;
 | 
			
		||||
}
 | 
			
		||||
@@ -2099,8 +1999,8 @@ void StarTrackerHandler::preparePowerRequest() {
 | 
			
		||||
 | 
			
		||||
void StarTrackerHandler::prepareSwitchToBootloaderCmd() {
 | 
			
		||||
  uint32_t length = 0;
 | 
			
		||||
  struct RebootActionRequest rebootReq{};
 | 
			
		||||
  prv_arc_pack_reboot_action_req(&rebootReq, commandBuffer, &length);
 | 
			
		||||
  struct RebootActionRequest rebootReq {};
 | 
			
		||||
  arc_pack_reboot_action_req(&rebootReq, commandBuffer, &length);
 | 
			
		||||
  rawPacket = commandBuffer;
 | 
			
		||||
  rawPacketLen = length;
 | 
			
		||||
}
 | 
			
		||||
@@ -2109,7 +2009,7 @@ void StarTrackerHandler::prepareTakeImageCommand(const uint8_t* commandData) {
 | 
			
		||||
  uint32_t length = 0;
 | 
			
		||||
  struct CameraActionRequest camReq;
 | 
			
		||||
  camReq.actionid = *commandData;
 | 
			
		||||
  prv_arc_pack_camera_action_req(&camReq, commandBuffer, &length);
 | 
			
		||||
  arc_pack_camera_action_req(&camReq, commandBuffer, &length);
 | 
			
		||||
  rawPacket = commandBuffer;
 | 
			
		||||
  rawPacketLen = length;
 | 
			
		||||
}
 | 
			
		||||
@@ -2175,14 +2075,6 @@ ReturnValue_t StarTrackerHandler::prepareRequestCentroidTm() {
 | 
			
		||||
  return returnvalue::OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ReturnValue_t StarTrackerHandler::prepareRequestBlobStatsTm() {
 | 
			
		||||
  uint32_t length = 0;
 | 
			
		||||
  arc_tm_pack_blobstats_req(commandBuffer, &length);
 | 
			
		||||
  rawPacket = commandBuffer;
 | 
			
		||||
  rawPacketLen = length;
 | 
			
		||||
  return returnvalue::OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ReturnValue_t StarTrackerHandler::prepareRequestCentroidsTm() {
 | 
			
		||||
  uint32_t length = 0;
 | 
			
		||||
  arc_tm_pack_centroids_req(commandBuffer, &length);
 | 
			
		||||
@@ -2457,8 +2349,7 @@ ReturnValue_t StarTrackerHandler::checkProgram() {
 | 
			
		||||
        internalState = InternalState::DONE;
 | 
			
		||||
      }
 | 
			
		||||
      break;
 | 
			
		||||
    case startracker::Program::FIRMWARE_BACKUP:
 | 
			
		||||
    case startracker::Program::FIRMWARE_MAIN: {
 | 
			
		||||
    case startracker::Program::FIRMWARE:
 | 
			
		||||
      if (startupState == StartupState::WAIT_CHECK_PROGRAM) {
 | 
			
		||||
        startupState = StartupState::BOOT_BOOTLOADER;
 | 
			
		||||
      }
 | 
			
		||||
@@ -2469,10 +2360,9 @@ ReturnValue_t StarTrackerHandler::checkProgram() {
 | 
			
		||||
        internalState = InternalState::FAILED_BOOTLOADER_BOOT;
 | 
			
		||||
      }
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
    default:
 | 
			
		||||
      sif::warning << "StarTrackerHandler::checkProgram: Version set has invalid program ID "
 | 
			
		||||
                   << static_cast<int>(versionSet.program.value) << std::endl;
 | 
			
		||||
      sif::warning << "StarTrackerHandler::checkProgram: Version set has invalid program ID"
 | 
			
		||||
                   << std::endl;
 | 
			
		||||
      return INVALID_PROGRAM;
 | 
			
		||||
  }
 | 
			
		||||
  return returnvalue::OK;
 | 
			
		||||
@@ -2508,36 +2398,6 @@ ReturnValue_t StarTrackerHandler::handleTm(const uint8_t* rawFrame, LocalPoolDat
 | 
			
		||||
  return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ReturnValue_t StarTrackerHandler::handleSolution(const uint8_t* rawFrame) {
 | 
			
		||||
  ReturnValue_t result = statusFieldCheck(rawFrame);
 | 
			
		||||
  if (result != returnvalue::OK) {
 | 
			
		||||
    return result;
 | 
			
		||||
  }
 | 
			
		||||
  PoolReadGuard pg(&solutionSet);
 | 
			
		||||
  if (pg.getReadResult() != returnvalue::OK) {
 | 
			
		||||
    return result;
 | 
			
		||||
  }
 | 
			
		||||
  const uint8_t* reply = rawFrame + TICKS_OFFSET;
 | 
			
		||||
  solutionSet.setValidityBufferGeneration(false);
 | 
			
		||||
  size_t sizeLeft = fullPacketLen;
 | 
			
		||||
  result = solutionSet.deSerialize(&reply, &sizeLeft, SerializeIF::Endianness::LITTLE);
 | 
			
		||||
  if (result != returnvalue::OK) {
 | 
			
		||||
    sif::warning << "StarTrackerHandler::handleTm: Deserialization failed for solution set: 0x"
 | 
			
		||||
                 << std::hex << std::setw(4) << result << std::dec << std::endl;
 | 
			
		||||
  }
 | 
			
		||||
  solutionSet.setValidityBufferGeneration(true);
 | 
			
		||||
  solutionSet.setValidity(true, true);
 | 
			
		||||
  solutionSet.caliQw.setValid(solutionSet.isTrustWorthy.value);
 | 
			
		||||
  solutionSet.caliQx.setValid(solutionSet.isTrustWorthy.value);
 | 
			
		||||
  solutionSet.caliQy.setValid(solutionSet.isTrustWorthy.value);
 | 
			
		||||
  solutionSet.caliQz.setValid(solutionSet.isTrustWorthy.value);
 | 
			
		||||
  solutionSet.trackQw.setValid(solutionSet.isTrustWorthy.value);
 | 
			
		||||
  solutionSet.trackQx.setValid(solutionSet.isTrustWorthy.value);
 | 
			
		||||
  solutionSet.trackQy.setValid(solutionSet.isTrustWorthy.value);
 | 
			
		||||
  solutionSet.trackQz.setValid(solutionSet.isTrustWorthy.value);
 | 
			
		||||
  return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ReturnValue_t StarTrackerHandler::handleAutoBlobTm(const uint8_t* rawFrame) {
 | 
			
		||||
  ReturnValue_t result = statusFieldCheck(rawFrame);
 | 
			
		||||
  if (result != returnvalue::OK) {
 | 
			
		||||
@@ -2932,19 +2792,17 @@ ReturnValue_t StarTrackerHandler::checkCommand(ActionId_t actionId) {
 | 
			
		||||
    case startracker::REQ_MATCHED_CENTROIDS:
 | 
			
		||||
    case startracker::REQ_BLOB:
 | 
			
		||||
    case startracker::REQ_BLOBS:
 | 
			
		||||
    case startracker::REQ_BLOB_STATS:
 | 
			
		||||
    case startracker::REQ_CENTROID:
 | 
			
		||||
    case startracker::REQ_CENTROIDS:
 | 
			
		||||
    case startracker::REQ_CONTRAST: {
 | 
			
		||||
      if (getMode() == MODE_ON and getSubmode() != startracker::SUBMODE_FIRMWARE) {
 | 
			
		||||
      if (getMode() == MODE_ON and getSubmode() != startracker::Program::FIRMWARE) {
 | 
			
		||||
        return STARTRACKER_NOT_RUNNING_FIRMWARE;
 | 
			
		||||
      }
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
    case startracker::FIRMWARE_UPDATE_MAIN:
 | 
			
		||||
    case startracker::FIRMWARE_UPDATE_BACKUP:
 | 
			
		||||
    case startracker::FIRMWARE_UPDATE:
 | 
			
		||||
    case startracker::FLASH_READ:
 | 
			
		||||
      if (getMode() != MODE_ON or getSubmode() != startracker::SUBMODE_BOOTLOADER) {
 | 
			
		||||
      if (getMode() != MODE_ON or getSubmode() != startracker::Program::BOOTLOADER) {
 | 
			
		||||
        return STARTRACKER_NOT_RUNNING_BOOTLOADER;
 | 
			
		||||
      }
 | 
			
		||||
      break;
 | 
			
		||||
@@ -2953,44 +2811,3 @@ ReturnValue_t StarTrackerHandler::checkCommand(ActionId_t actionId) {
 | 
			
		||||
  }
 | 
			
		||||
  return returnvalue::OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ReturnValue_t StarTrackerHandler::acceptExternalDeviceCommands() { return returnvalue::OK; }
 | 
			
		||||
 | 
			
		||||
ReturnValue_t StarTrackerHandler::getParameter(uint8_t domainId, uint8_t uniqueId,
 | 
			
		||||
                                               ParameterWrapper* parameterWrapper,
 | 
			
		||||
                                               const ParameterWrapper* newValues,
 | 
			
		||||
                                               uint16_t startAtIndex) {
 | 
			
		||||
  auto firmwareTargetUpdate = [&](bool persistent) {
 | 
			
		||||
    uint8_t value = 0;
 | 
			
		||||
    newValues->getElement(&value);
 | 
			
		||||
    if (value != static_cast<uint8_t>(startracker::FirmwareTarget::MAIN) &&
 | 
			
		||||
        value != static_cast<uint8_t>(startracker::FirmwareTarget::BACKUP)) {
 | 
			
		||||
      return HasParametersIF::INVALID_VALUE;
 | 
			
		||||
    }
 | 
			
		||||
    parameterWrapper->set(firmwareTargetRaw);
 | 
			
		||||
    if (persistent) {
 | 
			
		||||
      if (sdCardIF.isSdCardUsable(std::nullopt)) {
 | 
			
		||||
        const char* prefix = sdCardIF.getCurrentMountPrefix();
 | 
			
		||||
        std::filesystem::path path =
 | 
			
		||||
            std::filesystem::path(prefix) / startracker::FW_TARGET_CFG_PATH;
 | 
			
		||||
        std::ofstream of(path, std::ofstream::out | std::ofstream::trunc);
 | 
			
		||||
        if (value == static_cast<uint8_t>(startracker::FirmwareTarget::MAIN)) {
 | 
			
		||||
          of << "main\n";
 | 
			
		||||
        } else {
 | 
			
		||||
          of << "backup\n";
 | 
			
		||||
        }
 | 
			
		||||
      } else {
 | 
			
		||||
        return HasFileSystemIF::FILESYSTEM_INACTIVE;
 | 
			
		||||
      }
 | 
			
		||||
    };
 | 
			
		||||
    return returnvalue::OK;
 | 
			
		||||
  };
 | 
			
		||||
  if (uniqueId == startracker::ParamId::FIRMWARE_TARGET) {
 | 
			
		||||
    return firmwareTargetUpdate(false);
 | 
			
		||||
  }
 | 
			
		||||
  if (uniqueId == startracker::ParamId::FIRMWARE_TARGET_PERSISTENT) {
 | 
			
		||||
    return firmwareTargetUpdate(true);
 | 
			
		||||
  }
 | 
			
		||||
  return DeviceHandlerBase::getParameter(domainId, uniqueId, parameterWrapper, newValues,
 | 
			
		||||
                                         startAtIndex);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -11,7 +11,10 @@
 | 
			
		||||
#include <set>
 | 
			
		||||
#include <thread>
 | 
			
		||||
 | 
			
		||||
#include "OBSWConfig.h"
 | 
			
		||||
#include "devices/powerSwitcherList.h"
 | 
			
		||||
#include "fsfw/devicehandlers/DeviceHandlerBase.h"
 | 
			
		||||
#include "fsfw/src/fsfw/serialize/SerializeAdapter.h"
 | 
			
		||||
#include "fsfw/timemanager/Countdown.h"
 | 
			
		||||
 | 
			
		||||
extern "C" {
 | 
			
		||||
@@ -24,9 +27,7 @@ extern "C" {
 | 
			
		||||
 * @details Datasheet: https://eive-cloud.irs.uni-stuttgart.de/index.php/apps/files/?dir=/EIVE_IRS/
 | 
			
		||||
 *                     Arbeitsdaten/08_Used%20Components/ArcSec_KULeuven_Startracker/
 | 
			
		||||
 *                     Sagitta%201.0%20Datapack&fileid=659181
 | 
			
		||||
 * @note The STR code is a chaotic inconsistent mess and should be re-written with a simpler base
 | 
			
		||||
 *       class. DO NOT USE THIS AS REFERENCE. Stay away from it.
 | 
			
		||||
 * @author	J. Meier, R. Mueller
 | 
			
		||||
 * @author	J. Meier
 | 
			
		||||
 */
 | 
			
		||||
class StarTrackerHandler : public DeviceHandlerBase {
 | 
			
		||||
 public:
 | 
			
		||||
@@ -41,8 +42,8 @@ class StarTrackerHandler : public DeviceHandlerBase {
 | 
			
		||||
   * 						to high to enable the device.
 | 
			
		||||
   */
 | 
			
		||||
  StarTrackerHandler(object_id_t objectId, object_id_t comIF, CookieIF* comCookie,
 | 
			
		||||
                     StrComHandler* strHelper, power::Switch_t powerSwitch,
 | 
			
		||||
                     startracker::SdCardConfigPathGetter& cfgPathGetter, SdCardMountedIF& sdCardIF);
 | 
			
		||||
                     const char* jsonFileStr, StrComHandler* strHelper,
 | 
			
		||||
                     power::Switch_t powerSwitch);
 | 
			
		||||
  virtual ~StarTrackerHandler();
 | 
			
		||||
 | 
			
		||||
  ReturnValue_t initialize() override;
 | 
			
		||||
@@ -58,9 +59,6 @@ class StarTrackerHandler : public DeviceHandlerBase {
 | 
			
		||||
 | 
			
		||||
  Submode_t getInitialSubmode() override;
 | 
			
		||||
 | 
			
		||||
  ReturnValue_t getParameter(uint8_t domainId, uint8_t uniqueId, ParameterWrapper* parameterWrapper,
 | 
			
		||||
                             const ParameterWrapper* newValues, uint16_t startAtIndex) override;
 | 
			
		||||
 | 
			
		||||
 protected:
 | 
			
		||||
  void doStartUp() override;
 | 
			
		||||
  void doShutDown() override;
 | 
			
		||||
@@ -161,8 +159,7 @@ class StarTrackerHandler : public DeviceHandlerBase {
 | 
			
		||||
 | 
			
		||||
  // Ping request will reply ping with this ID (data field)
 | 
			
		||||
  static const uint32_t PING_ID = 0x55;
 | 
			
		||||
  uint8_t firmwareTargetRaw = static_cast<uint8_t>(startracker::FirmwareTarget::MAIN);
 | 
			
		||||
 | 
			
		||||
  static const uint32_t BOOT_REGION_ID = 1;
 | 
			
		||||
  static const MutexIF::TimeoutType TIMEOUT_TYPE = MutexIF::TimeoutType::WAITING;
 | 
			
		||||
  static const uint32_t MUTEX_TIMEOUT = 20;
 | 
			
		||||
  static const uint32_t BOOT_TIMEOUT = 1000;
 | 
			
		||||
@@ -216,7 +213,6 @@ class StarTrackerHandler : public DeviceHandlerBase {
 | 
			
		||||
  startracker::CentroidSet centroidSet;
 | 
			
		||||
  startracker::CentroidsSet centroidsSet;
 | 
			
		||||
  startracker::ContrastSet contrastSet;
 | 
			
		||||
  startracker::BlobStatsSet blobStatsSet;
 | 
			
		||||
 | 
			
		||||
  // Pointer to object responsible for uploading and downloading images to/from the star tracker
 | 
			
		||||
  StrComHandler* strHelper = nullptr;
 | 
			
		||||
@@ -244,12 +240,11 @@ class StarTrackerHandler : public DeviceHandlerBase {
 | 
			
		||||
    Subscription subscription;
 | 
			
		||||
    AutoThreshold autoThreshold;
 | 
			
		||||
  };
 | 
			
		||||
  bool jcfgPending = false;
 | 
			
		||||
  JsonConfigs jcfgs;
 | 
			
		||||
  Countdown jcfgCountdown = Countdown(1000);
 | 
			
		||||
  Countdown jcfgCountdown = Countdown(250);
 | 
			
		||||
  bool commandExecuted = false;
 | 
			
		||||
  std::thread jsonCfgTask;
 | 
			
		||||
  static void setUpJsonCfgs(JsonConfigs& cfgs, std::string paramJsonFile);
 | 
			
		||||
  static void setUpJsonCfgs(JsonConfigs& cfgs, const char* paramJsonFile);
 | 
			
		||||
 | 
			
		||||
  std::string paramJsonFile;
 | 
			
		||||
 | 
			
		||||
@@ -316,14 +311,10 @@ class StarTrackerHandler : public DeviceHandlerBase {
 | 
			
		||||
  std::set<DeviceCommandId_t> additionalRequestedTm{};
 | 
			
		||||
  std::set<DeviceCommandId_t>::iterator currentSecondaryTmIter;
 | 
			
		||||
 | 
			
		||||
  SdCardMountedIF& sdCardIF;
 | 
			
		||||
  startracker::SdCardConfigPathGetter& cfgPathGetter;
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @brief   Handles internal state
 | 
			
		||||
   */
 | 
			
		||||
  void handleInternalState();
 | 
			
		||||
  void loadTargetFirmwareFromPersistentCfg();
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @brief   Checks mode for commands requiring MODE_ON of MODE_NORMAL for execution.
 | 
			
		||||
@@ -384,7 +375,7 @@ class StarTrackerHandler : public DeviceHandlerBase {
 | 
			
		||||
   * @brief   Fills command buffer with data to boot image (works only when star tracker is
 | 
			
		||||
   *          in bootloader mode).
 | 
			
		||||
   */
 | 
			
		||||
  void prepareBootCommand(startracker::FirmwareTarget target);
 | 
			
		||||
  void prepareBootCommand();
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @brief   Fills command buffer with command to get the checksum of a flash part
 | 
			
		||||
@@ -471,7 +462,6 @@ class StarTrackerHandler : public DeviceHandlerBase {
 | 
			
		||||
  ReturnValue_t prepareRequestCentroidTm();
 | 
			
		||||
  ReturnValue_t prepareRequestCentroidsTm();
 | 
			
		||||
  ReturnValue_t prepareRequestContrastTm();
 | 
			
		||||
  ReturnValue_t prepareRequestBlobStatsTm();
 | 
			
		||||
  ReturnValue_t prepareRequestTrackingParams();
 | 
			
		||||
  ReturnValue_t prepareRequestValidationParams();
 | 
			
		||||
  ReturnValue_t prepareRequestAlgoParams();
 | 
			
		||||
@@ -532,7 +522,6 @@ class StarTrackerHandler : public DeviceHandlerBase {
 | 
			
		||||
  ReturnValue_t handleTm(const uint8_t* rawFrame, LocalPoolDataSetBase& dataset,
 | 
			
		||||
                         const char* context);
 | 
			
		||||
 | 
			
		||||
  ReturnValue_t handleSolution(const uint8_t* rawFrame);
 | 
			
		||||
  ReturnValue_t handleAutoBlobTm(const uint8_t* rawFrame);
 | 
			
		||||
  ReturnValue_t handleMatchedCentroidTm(const uint8_t* rawFrame);
 | 
			
		||||
  ReturnValue_t handleBlobTm(const uint8_t* rawFrame);
 | 
			
		||||
@@ -553,11 +542,6 @@ class StarTrackerHandler : public DeviceHandlerBase {
 | 
			
		||||
  void doNormalTransition(Mode_t modeFrom, Submode_t subModeFrom);
 | 
			
		||||
  void bootFirmware(Mode_t toMode);
 | 
			
		||||
  void bootBootloader();
 | 
			
		||||
  bool reloadJsonCfgFile();
 | 
			
		||||
  ReturnValue_t acceptExternalDeviceCommands() override;
 | 
			
		||||
 | 
			
		||||
  ReturnValue_t handleFirmwareUpdateCommand(const uint8_t* data, size_t size,
 | 
			
		||||
                                            startracker::FirmwareTarget target);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif /* MISSION_DEVICES_STARTRACKERHANDLER_H_ */
 | 
			
		||||
 
 | 
			
		||||
@@ -7,25 +7,13 @@
 | 
			
		||||
#include <fsfw/devicehandlers/DeviceHandlerIF.h>
 | 
			
		||||
#include <fsfw/serviceinterface/ServiceInterfaceStream.h>
 | 
			
		||||
 | 
			
		||||
#include <optional>
 | 
			
		||||
#include "objects/systemObjectList.h"
 | 
			
		||||
 | 
			
		||||
namespace startracker {
 | 
			
		||||
 | 
			
		||||
static const Submode_t SUBMODE_BOOTLOADER = 1;
 | 
			
		||||
static const Submode_t SUBMODE_FIRMWARE = 2;
 | 
			
		||||
 | 
			
		||||
enum class FirmwareTarget : uint8_t { MAIN = 1, BACKUP = 10 };
 | 
			
		||||
 | 
			
		||||
static constexpr char FW_TARGET_CFG_PATH[] = "startracker/fw-target.txt";
 | 
			
		||||
 | 
			
		||||
enum ParamId : uint32_t { FIRMWARE_TARGET = 1, FIRMWARE_TARGET_PERSISTENT = 2 };
 | 
			
		||||
 | 
			
		||||
class SdCardConfigPathGetter {
 | 
			
		||||
 public:
 | 
			
		||||
  virtual ~SdCardConfigPathGetter() = default;
 | 
			
		||||
  virtual std::optional<std::string> getCfgPath() = 0;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @brief    Returns the frame type field of a decoded frame.
 | 
			
		||||
 */
 | 
			
		||||
@@ -328,13 +316,6 @@ enum PoolIds : lp_id_t {
 | 
			
		||||
  CONTRAST_B,
 | 
			
		||||
  CONTRAST_C,
 | 
			
		||||
  CONTRAST_D,
 | 
			
		||||
 | 
			
		||||
  TICKS_BLOB_STATS,
 | 
			
		||||
  TIME_BLOB_STATS,
 | 
			
		||||
  BLOB_STATS_NOISE,
 | 
			
		||||
  BLOB_STATS_THOLD,
 | 
			
		||||
  BLOB_STATS_LVALID,
 | 
			
		||||
  BLOB_STATS_OFLOW,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static const DeviceCommandId_t PING_REQUEST = 0;
 | 
			
		||||
@@ -386,7 +367,7 @@ static const DeviceCommandId_t REQ_DEBUG_CAMERA = 80;
 | 
			
		||||
static const DeviceCommandId_t LOGLEVEL = 81;
 | 
			
		||||
static const DeviceCommandId_t LOGSUBSCRIPTION = 82;
 | 
			
		||||
static const DeviceCommandId_t DEBUG_CAMERA = 83;
 | 
			
		||||
static const DeviceCommandId_t FIRMWARE_UPDATE_MAIN = 84;
 | 
			
		||||
static const DeviceCommandId_t FIRMWARE_UPDATE = 84;
 | 
			
		||||
static const DeviceCommandId_t DISABLE_TIMESTAMP_GENERATION = 85;
 | 
			
		||||
static const DeviceCommandId_t ENABLE_TIMESTAMP_GENERATION = 86;
 | 
			
		||||
static constexpr DeviceCommandId_t SET_TIME_FROM_SYS_TIME = 87;
 | 
			
		||||
@@ -400,10 +381,6 @@ static constexpr DeviceCommandId_t REQ_CENTROIDS = 94;
 | 
			
		||||
static constexpr DeviceCommandId_t ADD_SECONDARY_TM_TO_NORMAL_MODE = 95;
 | 
			
		||||
static constexpr DeviceCommandId_t RESET_SECONDARY_TM_SET = 96;
 | 
			
		||||
static constexpr DeviceCommandId_t READ_SECONDARY_TM_SET = 97;
 | 
			
		||||
static constexpr DeviceCommandId_t RELOAD_JSON_CFG_FILE = 100;
 | 
			
		||||
static constexpr DeviceCommandId_t FIRMWARE_UPDATE_BACKUP = 101;
 | 
			
		||||
static constexpr DeviceCommandId_t REQ_BLOB_STATS = 102;
 | 
			
		||||
 | 
			
		||||
static const DeviceCommandId_t NONE = 0xFFFFFFFF;
 | 
			
		||||
 | 
			
		||||
static const uint32_t VERSION_SET_ID = REQ_VERSION;
 | 
			
		||||
@@ -435,7 +412,6 @@ static const uint32_t BLOBS_SET_ID = REQ_BLOBS;
 | 
			
		||||
static const uint32_t CENTROID_SET_ID = REQ_CENTROID;
 | 
			
		||||
static const uint32_t CENTROIDS_SET_ID = REQ_CENTROIDS;
 | 
			
		||||
static const uint32_t CONTRAST_SET_ID = REQ_CONTRAST;
 | 
			
		||||
static const uint32_t BLOB_STATS_SET_ID = REQ_BLOB_STATS;
 | 
			
		||||
 | 
			
		||||
/** Max size of unencoded frame */
 | 
			
		||||
static const size_t MAX_FRAME_SIZE = 1200;
 | 
			
		||||
@@ -502,13 +478,11 @@ static constexpr uint8_t CENTROID = 26;
 | 
			
		||||
static constexpr uint8_t CENTROIDS = 37;
 | 
			
		||||
static constexpr uint8_t AUTO_BLOB = 39;
 | 
			
		||||
static constexpr uint8_t MATCHED_CENTROIDS = 40;
 | 
			
		||||
static constexpr uint8_t BLOB_STATS = 49;
 | 
			
		||||
}  // namespace ID
 | 
			
		||||
 | 
			
		||||
namespace Program {
 | 
			
		||||
static const uint8_t BOOTLOADER = 1;
 | 
			
		||||
static const uint8_t FIRMWARE_MAIN = 2;
 | 
			
		||||
static const uint8_t FIRMWARE_BACKUP = 3;
 | 
			
		||||
static const uint8_t FIRMWARE = 2;
 | 
			
		||||
}  // namespace Program
 | 
			
		||||
 | 
			
		||||
namespace region_secrets {
 | 
			
		||||
@@ -528,7 +502,7 @@ static const uint32_t REGION_12_SECRET = 0x42fedef6;
 | 
			
		||||
static const uint32_t REGION_13_SECRET = 0xe53cf10d;
 | 
			
		||||
static const uint32_t REGION_14_SECRET = 0xe862b70b;
 | 
			
		||||
static const uint32_t REGION_15_SECRET = 0x79b537ca;
 | 
			
		||||
static const uint32_t SECRETS[16]{
 | 
			
		||||
static const uint32_t secret[16]{
 | 
			
		||||
    REGION_0_SECRET,  REGION_1_SECRET,  REGION_2_SECRET,  REGION_3_SECRET,
 | 
			
		||||
    REGION_4_SECRET,  REGION_5_SECRET,  REGION_6_SECRET,  REGION_7_SECRET,
 | 
			
		||||
    REGION_8_SECRET,  REGION_9_SECRET,  REGION_10_SECRET, REGION_11_SECRET,
 | 
			
		||||
@@ -557,12 +531,7 @@ enum class FlashSections : uint8_t {
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// Flash region IDs of firmware partition
 | 
			
		||||
enum class FirmwareRegions : uint32_t {
 | 
			
		||||
  FIRST_MAIN = 1,
 | 
			
		||||
  LAST_MAIN = 8,
 | 
			
		||||
  FIRST_BACKUP = 10,
 | 
			
		||||
  LAST_BACKUP = 16
 | 
			
		||||
};
 | 
			
		||||
enum class FirmwareRegions : uint32_t { FIRST = 1, LAST = 8 };
 | 
			
		||||
 | 
			
		||||
static const uint32_t FLASH_REGION_SIZE = 0x20000;
 | 
			
		||||
 | 
			
		||||
@@ -1569,23 +1538,6 @@ class CentroidsSet : public StaticLocalDataSet<10> {
 | 
			
		||||
      lp_vec_t<uint8_t, 16>(sid.objectId, PoolIds::CENTROIDS_MAGNITUDES, this);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class BlobStatsSet : public StaticLocalDataSet<6> {
 | 
			
		||||
 public:
 | 
			
		||||
  BlobStatsSet(HasLocalDataPoolIF* owner) : StaticLocalDataSet(owner, BLOB_STATS_SET_ID) {}
 | 
			
		||||
 | 
			
		||||
  // Data received from the Centroids Telemetry Set (ID 49)
 | 
			
		||||
  lp_var_t<uint32_t> ticks = lp_var_t<uint32_t>(sid.objectId, PoolIds::TICKS_BLOB_STATS, this);
 | 
			
		||||
  lp_var_t<uint64_t> time = lp_var_t<uint64_t>(sid.objectId, PoolIds::TIME_BLOB_STATS, this);
 | 
			
		||||
  lp_vec_t<uint8_t, 16> noise =
 | 
			
		||||
      lp_vec_t<uint8_t, 16>(sid.objectId, PoolIds::BLOB_STATS_NOISE, this);
 | 
			
		||||
  lp_vec_t<uint8_t, 16> thold =
 | 
			
		||||
      lp_vec_t<uint8_t, 16>(sid.objectId, PoolIds::BLOB_STATS_THOLD, this);
 | 
			
		||||
  lp_vec_t<uint8_t, 16> lvalid =
 | 
			
		||||
      lp_vec_t<uint8_t, 16>(sid.objectId, PoolIds::BLOB_STATS_LVALID, this);
 | 
			
		||||
  lp_vec_t<uint8_t, 16> oflow =
 | 
			
		||||
      lp_vec_t<uint8_t, 16>(sid.objectId, PoolIds::BLOB_STATS_OFLOW, this);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class ContrastSet : public StaticLocalDataSet<8> {
 | 
			
		||||
 public:
 | 
			
		||||
  ContrastSet(HasLocalDataPoolIF* owner) : StaticLocalDataSet(owner, CONTRAST_SET_ID) {}
 | 
			
		||||
 
 | 
			
		||||
@@ -54,13 +54,8 @@ ReturnValue_t LiveTmTask::performOperation(uint8_t opCode) {
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      } else if (result != MessageQueueIF::EMPTY) {
 | 
			
		||||
        const char* contextStr = "Regular TM queue";
 | 
			
		||||
        if (isCfdp) {
 | 
			
		||||
          contextStr = "CFDP TM queue";
 | 
			
		||||
        }
 | 
			
		||||
        sif::warning << "LiveTmTask: " << contextStr << " handling failure, returncode 0x"
 | 
			
		||||
                     << std::setfill('0') << std::hex << std::setw(4) << result << std::dec
 | 
			
		||||
                     << std::endl;
 | 
			
		||||
        sif::warning << "LiveTmTask: TM queue failure, returncode 0x" << std::hex << std::setw(4)
 | 
			
		||||
                     << result << std::dec << std::endl;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -178,16 +173,15 @@ ReturnValue_t LiveTmTask::handleGenericTmQueue(MessageQueueIF& queue, bool isCfd
 | 
			
		||||
    size_t writtenSize = 0;
 | 
			
		||||
    result = channel.write(data, size, writtenSize);
 | 
			
		||||
    if (result == DirectTmSinkIF::PARTIALLY_WRITTEN) {
 | 
			
		||||
      result = channel.handleWriteCompletionSynchronously(writtenSize, 400);
 | 
			
		||||
      result = channel.handleWriteCompletionSynchronously(writtenSize, 200);
 | 
			
		||||
      if (result != returnvalue::OK) {
 | 
			
		||||
        // TODO: Event? Might lead to dangerous spam though..
 | 
			
		||||
        sif::warning << "LiveTmTask: Synchronous write of last segment failed with code 0x"
 | 
			
		||||
                     << std::setfill('0') << std::setw(4) << std::hex << result << std::dec
 | 
			
		||||
                     << std::endl;
 | 
			
		||||
                     << std::setw(4) << std::hex << result << std::dec << std::endl;
 | 
			
		||||
      }
 | 
			
		||||
    } else if (result != returnvalue::OK) {
 | 
			
		||||
      sif::error << "LiveTmTask: Channel write failed with code 0x" << std::setfill('0') << std::hex
 | 
			
		||||
                 << std::setw(4) << result << std::dec << std::endl;
 | 
			
		||||
      sif::error << "LiveTmTask: Channel write failed with code 0x" << std::hex << std::setw(4)
 | 
			
		||||
                 << result << std::dec << std::endl;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  // Try delete in any case, ignore failures (which should not happen), it is more important to
 | 
			
		||||
 
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user