# rknall/opensafety architecture

> Architecture diagram of the GitHub repository rknall/opensafety, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-09). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/rknall/opensafety
- Repository: https://github.com/rknall/opensafety

## Overview

openSAFETY is a safety-oriented transport-protocol stack that also manages safety-network configuration; the README describes it as an IEC 61508 reference implementation. The principal workflow is safety-node state management and process-data communication, with configuration and parameter access handled through management and SSDO services backed by the Object Dictionary. The tree also includes a CRC calculation/checking utility. Edges are conservative: the sampled excerpts show specific service-FSM behavior and Object Dictionary responsibilities, but do not expose the full runtime wiring among stack modules.

Main entry points: [`src/eplssrc/SN/SNMTSsnstate.c`](https://github.com/rknall/opensafety/blob/master/src/eplssrc/SN/SNMTSsnstate.c) (SNMT slave), [`src/eplssrc/SCM/SSDOCservice.c`](https://github.com/rknall/opensafety/blob/master/src/eplssrc/SCM/SSDOCservice.c) (SSDO client service), [`src/eplssrc/SN/SERRmain.c`](https://github.com/rknall/opensafety/blob/master/src/eplssrc/SN/SERRmain.c) (Safety errors), [`src/eplssrc/SN/SPDOmain.c`](https://github.com/rknall/opensafety/blob/master/src/eplssrc/SN/SPDOmain.c) (Process data)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_node_control["Safety-node control"]
  node_snmt_slave["SNMT slave<br/>[SNMTSsnstate.c]"]
  node_safety_errors["Safety errors<br/>[SERRmain.c]"]
  node_error_api["Error API<br/>[SERRapi.h]"]
  node_scfm["Flow monitoring<br/>[SCFMmain.c]"]
end

subgraph group_data_transport["Safety data transport"]
  node_spdo["Process data<br/>[SPDOmain.c]"]
  node_spdo_states["SPDO state machines<br/>[SPDOrxSyncConsSm.c]"]
  node_snmt_master["SNMT master<br/>[SNMTMfsm.c]"]
end

subgraph group_configuration_services["Configuration services"]
  node_ssdo_server["SSDO server<br/>[SSDOSmain.c]"]
  node_ssdo_client_service["SSDO client service<br/>[SSDOCservice.c]"]
  node_ssdo_transfer["SSDO transfers<br/>[SSDOCprotocol.c]"]
  node_object_dictionary[("Object Dictionary<br/>[SODmain.c]")]
  node_configuration_manager["Configuration manager<br/>[SCMmain.c]"]
end

subgraph group_support_tools["CRC utility"]
  node_crc_library["CRC calculation<br/>[crc_protocol.c]"]
  node_crc_checker["CRC checker<br/>[oscrccheck.c]"]
end

node_application(("Application"))
node_safety_network(("Safety network"))

node_application -.->|"requests state change"| node_snmt_slave
node_snmt_slave -->|"starts activation"| node_spdo
node_safety_network -.->|"carries process data"| node_spdo
node_safety_network -.->|"carries service frames"| node_ssdo_server
node_snmt_master -.->|"coordinates services"| node_ssdo_client_service
node_ssdo_client_service -.->|"manages transfer FSM"| node_ssdo_transfer
node_ssdo_transfer -.->|"accesses objects"| node_object_dictionary
node_ssdo_server -.->|"serves parameters"| node_object_dictionary
node_configuration_manager -.->|"configures entries"| node_object_dictionary
node_ssdo_client_service -.->|"reports errors"| node_safety_errors
node_snmt_slave -->|"sets errors"| node_safety_errors
node_spdo -.->|"uses state machine"| node_spdo_states
node_crc_checker -.->|"checks checksums"| node_crc_library
node_application -.->|"sets configuration"| node_configuration_manager
node_safety_errors -.->|"exposes error API"| node_error_api
node_scfm -.->|"tracks execution"| node_snmt_slave

click node_snmt_slave "https://github.com/rknall/opensafety/blob/master/src/eplssrc/SN/SNMTSsnstate.c"
click node_safety_errors "https://github.com/rknall/opensafety/blob/master/src/eplssrc/SN/SERRmain.c"
click node_error_api "https://github.com/rknall/opensafety/blob/master/src/eplssrc/SN/SERRapi.h"
click node_scfm "https://github.com/rknall/opensafety/blob/master/src/eplssrc/SN/SCFMmain.c"
click node_spdo "https://github.com/rknall/opensafety/blob/master/src/eplssrc/SN/SPDOmain.c"
click node_spdo_states "https://github.com/rknall/opensafety/blob/master/src/eplssrc/SN/SPDOrxSyncConsSm.c"
click node_snmt_master "https://github.com/rknall/opensafety/blob/master/src/eplssrc/SCM/SNMTMfsm.c"
click node_ssdo_server "https://github.com/rknall/opensafety/blob/master/src/eplssrc/SN/SSDOSmain.c"
click node_ssdo_client_service "https://github.com/rknall/opensafety/blob/master/src/eplssrc/SCM/SSDOCservice.c"
click node_ssdo_transfer "https://github.com/rknall/opensafety/blob/master/src/eplssrc/SCM/SSDOCprotocol.c"
click node_object_dictionary "https://github.com/rknall/opensafety/blob/master/src/eplssrc/SN/SODmain.c"
click node_configuration_manager "https://github.com/rknall/opensafety/blob/master/src/eplssrc/SCM/SCMmain.c"
click node_crc_library "https://github.com/rknall/opensafety/blob/master/src/tools/oschecksum/crc_protocol.c"
click node_crc_checker "https://github.com/rknall/opensafety/blob/master/src/tools/oscrccheck/oscrccheck.c"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_snmt_slave,node_safety_errors,node_error_api,node_scfm toneBlue
class node_spdo,node_spdo_states,node_snmt_master toneAmber
class node_ssdo_server,node_ssdo_client_service,node_ssdo_transfer,node_object_dictionary,node_configuration_manager toneMint
class node_crc_library,node_crc_checker toneRose
class node_application,node_safety_network toneIndigo
```

## Components

### Safety-node control

- [SNMT slave](https://github.com/rknall/opensafety/blob/master/src/eplssrc/SN/SNMTSsnstate.c): `src/eplssrc/SN/SNMTSsnstate.c`
- [Safety errors](https://github.com/rknall/opensafety/blob/master/src/eplssrc/SN/SERRmain.c): `src/eplssrc/SN/SERRmain.c`
- [Error API](https://github.com/rknall/opensafety/blob/master/src/eplssrc/SN/SERRapi.h): `src/eplssrc/SN/SERRapi.h`
- [Flow monitoring](https://github.com/rknall/opensafety/blob/master/src/eplssrc/SN/SCFMmain.c): `src/eplssrc/SN/SCFMmain.c`

### Safety data transport

- [Process data](https://github.com/rknall/opensafety/blob/master/src/eplssrc/SN/SPDOmain.c): `src/eplssrc/SN/SPDOmain.c`
- [SPDO state machines](https://github.com/rknall/opensafety/blob/master/src/eplssrc/SN/SPDOrxSyncConsSm.c): `src/eplssrc/SN/SPDOrxSyncConsSm.c`
- [SNMT master](https://github.com/rknall/opensafety/blob/master/src/eplssrc/SCM/SNMTMfsm.c): `src/eplssrc/SCM/SNMTMfsm.c`

### Configuration services

- [SSDO server](https://github.com/rknall/opensafety/blob/master/src/eplssrc/SN/SSDOSmain.c): `src/eplssrc/SN/SSDOSmain.c`
- [SSDO client service](https://github.com/rknall/opensafety/blob/master/src/eplssrc/SCM/SSDOCservice.c): `src/eplssrc/SCM/SSDOCservice.c`
- [SSDO transfers](https://github.com/rknall/opensafety/blob/master/src/eplssrc/SCM/SSDOCprotocol.c): `src/eplssrc/SCM/SSDOCprotocol.c`
- [Object Dictionary](https://github.com/rknall/opensafety/blob/master/src/eplssrc/SN/SODmain.c): `src/eplssrc/SN/SODmain.c`
- [Configuration manager](https://github.com/rknall/opensafety/blob/master/src/eplssrc/SCM/SCMmain.c): `src/eplssrc/SCM/SCMmain.c`

### CRC utility

- [CRC calculation](https://github.com/rknall/opensafety/blob/master/src/tools/oschecksum/crc_protocol.c): `src/tools/oschecksum/crc_protocol.c`
- [CRC checker](https://github.com/rknall/opensafety/blob/master/src/tools/oscrccheck/oscrccheck.c): `src/tools/oscrccheck/oscrccheck.c`

### Other components

- **Application**
- **Safety network**

## Connections

- Application → SNMT slave: requests state change
- SNMT slave → Process data: starts activation (evidence: `src/eplssrc/SN/SNMTSsnstate.c`)
- Safety network → Process data: carries process data
- Safety network → SSDO server: carries service frames
- SNMT master → SSDO client service: coordinates services
- SSDO client service → SSDO transfers: manages transfer FSM
- SSDO transfers → Object Dictionary: accesses objects (evidence: `src/eplssrc/SCM/SSDOCprotocol.c`)
- SSDO server → Object Dictionary: serves parameters
- Configuration manager → Object Dictionary: configures entries
- SSDO client service → Safety errors: reports errors (evidence: `src/eplssrc/SCM/SSDOCservice.c`)
- SNMT slave → Safety errors: sets errors (evidence: `src/eplssrc/SN/SNMTSsnstate.c`)
- Process data → SPDO state machines: uses state machine
- CRC checker → CRC calculation: checks checksums
- Application → Configuration manager: sets configuration
- Safety errors → Error API: exposes error API
- Flow monitoring → SNMT slave: tracks execution
