diff --git a/.ci/asciidoc-converter/src/main/kotlin/org/sdpi/asciidoc/extension/SdpiInformationCollector.kt b/.ci/asciidoc-converter/src/main/kotlin/org/sdpi/asciidoc/extension/SdpiInformationCollector.kt index 720ffbf5..0fdf7bcd 100644 --- a/.ci/asciidoc-converter/src/main/kotlin/org/sdpi/asciidoc/extension/SdpiInformationCollector.kt +++ b/.ci/asciidoc-converter/src/main/kotlin/org/sdpi/asciidoc/extension/SdpiInformationCollector.kt @@ -1129,6 +1129,11 @@ class SdpiInformationCollector( } } + /* + Matches actors with contributions for transactions referenced from profiles using + the syntax in the form: + sdpi_include_transaction::DEV-23[initiator="required", receiver="optional"] + */ private fun linkActorsToTransactionReferences() { for (profile in profiles.values) { linkActorsToTransactionReferences(profile.transactionReferences) @@ -1147,10 +1152,15 @@ class SdpiInformationCollector( for (obl in ref.obligations) { if (obl.actorId == null) { val contrib = obl.contribution - val role = transaction.actorRoles?.firstOrNull { it.contribution == contrib } - if (role != null) { - val strActorId = role.actorId - obl.actorId = strActorId + if (transaction.actorRoles != null) { + val matchingRoles = transaction.actorRoles.filter{it.contributions.contains(contrib)} + check(matchingRoles.size <= 1) { + logger.error("More than one actor contributes $contrib. Specify actor in $BLOCK_MACRO_NAME_INCLUDE_TRANSACTION") + } + if (matchingRoles.size == 1) { + val strActorId = matchingRoles[0].actorId + obl.actorId = strActorId + } } } } diff --git a/.ci/asciidoc-converter/src/main/kotlin/org/sdpi/asciidoc/extension/TransactionActorsProcessor.kt b/.ci/asciidoc-converter/src/main/kotlin/org/sdpi/asciidoc/extension/TransactionActorsProcessor.kt index 99144e58..808cf9f8 100644 --- a/.ci/asciidoc-converter/src/main/kotlin/org/sdpi/asciidoc/extension/TransactionActorsProcessor.kt +++ b/.ci/asciidoc-converter/src/main/kotlin/org/sdpi/asciidoc/extension/TransactionActorsProcessor.kt @@ -55,26 +55,32 @@ class TransactionActorsProcessor : BlockProcessor(BLOCK_NAME_TRANSACTION_ACTORS) val roles = mutableListOf() var strActor: String? = null - var contribution: Contribution? = null + var contributions = mutableListOf() val description = mutableListOf() for (strLine in blockLines) { if (strLine.startsWith('[')) { - if (strActor != null && contribution != null && description.isNotEmpty()) { - roles.add(SdpiActorRole(strActor, contribution, description.toList())) + + // remove trailing blank lines. + while(description.isNotEmpty() && description.last().isEmpty()) { + description.removeLast() + } + + if (strActor != null && contributions.isNotEmpty() && description.isNotEmpty()) { + roles.add(SdpiActorRole(strActor, contributions, description.toList())) } description.clear() val result = parseContributorAttributes(strLine) strActor = result.first - contribution = result.second + contributions = result.second.toMutableList() } else { description.add(strLine) } } - if (strActor != null && contribution != null && description.isNotEmpty()) { - roles.add(SdpiActorRole(strActor, contribution, description.toList())) + if (strActor != null && contributions.isNotEmpty() && description.isNotEmpty()) { + roles.add(SdpiActorRole(strActor, contributions, description.toList())) } return roles @@ -104,12 +110,12 @@ class TransactionActorsProcessor : BlockProcessor(BLOCK_NAME_TRANSACTION_ACTORS) for (actorRole in roles) { val strActorId = "RefActor:${actorRole.actorId}[]" - val contribution = actorRole.contribution + val contributions = actorRole.contributions val strDescription = actorRole.description.joinToString("\r\n") val row = createTableRow(roleTable) row.cells.add(createTableCell(colActor, strActorId)) - row.cells.add(createTableCell(colContribution, contribution.keyword)) + row.cells.add(createTableCell(colContribution, contributions.joinToString { it.keyword })) row.cells.add(createTableCell(colDescription, strDescription)) @@ -119,31 +125,37 @@ class TransactionActorsProcessor : BlockProcessor(BLOCK_NAME_TRANSACTION_ACTORS) return roleTable } - private fun parseContributorAttributes(strLine: String): Pair { + private fun parseContributorAttributes(strLine: String): Pair> { val attributes = parseAttributes(strLine) - val strActorId = attributes[Roles.Transaction.ACTOR_ID.key] - checkNotNull(strActorId) { + val actorId = attributes.firstOrNull{ it.first == Roles.Transaction.ACTOR_ID.key} + checkNotNull(actorId) { logger.error("Actor in transaction is missing an actor id") } - val strContribution = attributes[Roles.Transaction.CONTRIBUTION.key] - checkNotNull(strContribution) { - logger.error("Actor $strActorId in transaction is missing a contribution") + val strActorId = actorId.second + val contributions = mutableListOf() + for(contribution in attributes.filter{it.first == Roles.Transaction.CONTRIBUTION.key}) { + val strContribution = contribution.second + val cont = parseContribution(strContribution) + checkNotNull(cont) { + logger.error("Actor $strActorId's contribution '$strContribution' is not recognized") + } + contributions.add(cont) } - val contribution = parseContribution(strContribution) - checkNotNull(contribution) { - logger.error("Actor $strActorId's contribution '$strContribution' is not recognized") + + check(contributions.isNotEmpty()) { + logger.error("Actor $strActorId in transaction is missing a contribution") } - return Pair(strActorId, contribution) + return Pair(strActorId, contributions) } - private fun parseAttributes(strValue: String): Map { - val attributes = mutableMapOf() + private fun parseAttributes(strValue: String): List> { + val attributes = mutableListOf>() for (match in RE_ATTRIBUTES.findAll(strValue)) { val (key, value) = match.destructured - attributes[key] = value + attributes.add(Pair(key, value)) } return attributes diff --git a/.ci/asciidoc-converter/src/main/kotlin/org/sdpi/asciidoc/model/SdpiActor.kt b/.ci/asciidoc-converter/src/main/kotlin/org/sdpi/asciidoc/model/SdpiActor.kt index fc26c73b..8370e035 100644 --- a/.ci/asciidoc-converter/src/main/kotlin/org/sdpi/asciidoc/model/SdpiActor.kt +++ b/.ci/asciidoc-converter/src/main/kotlin/org/sdpi/asciidoc/model/SdpiActor.kt @@ -22,7 +22,7 @@ data class SdpiActor( @Serializable data class SdpiActorRole( val actorId: String, - val contribution: Contribution, + val contributions: List, val description: List, ) { } diff --git a/.ci/asciidoc-converter/src/main/kotlin/org/sdpi/asciidoc/model/SdpiTransaction.kt b/.ci/asciidoc-converter/src/main/kotlin/org/sdpi/asciidoc/model/SdpiTransaction.kt index 9b105906..d2c2e5f8 100644 --- a/.ci/asciidoc-converter/src/main/kotlin/org/sdpi/asciidoc/model/SdpiTransaction.kt +++ b/.ci/asciidoc-converter/src/main/kotlin/org/sdpi/asciidoc/model/SdpiTransaction.kt @@ -19,28 +19,14 @@ data class SdpiTransaction( return "link:#$strAnchor[$id]" } - fun getContributionFor(contribution: Contribution): Contribution? { - if (actorRoles == null) { - return null - } - - for(actor in actorRoles) { - if (actor.contribution == contribution) { - return actor.contribution - } - } - - return null - } - - fun getContributionForActor(strActorId: String): Contribution? { + fun getContributionForActor(strActorId: String): List? { if (actorRoles == null) { return null } for(actor in actorRoles) { if (actor.actorId == strActorId) { - return actor.contribution + return actor.contributions } } diff --git a/CHANGELOG.md b/CHANGELOG.md index e3712dfa..9e886901 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,9 +18,10 @@ Each section shall contain a list of action items of the following format: `> using the `sdpi_include_transaction` [include processor](https://docs.asciidoctor.org/asciidoctorj/latest/extensions/include-processor/) and declares the obligations of contributors. -There are two forms for `sdpi_include_transaction`. The first form defines obligations for the actor roles defined in the transaction. That is, only the contribution (`initiator`, `receiver`, `responder`) and obligation (`required`, `optional`) are required. It is not necessary to repeat the actor. For example: +There are two forms for `sdpi_include_transaction`. The first form defines obligations for the actor roles defined in the transaction. That is, only the contribution (`initiator`, `receiver`, `responder`) and obligation (`required`, `optional`) are required. It is not necessary to repeat the actor provided the transaction actor obligation is not ambiguous. Transaction actor's obligations are ambiguous when more than one actor has the same obligation (e.g., two actors both initiate messages in the transaction). + +For example: [source, asciidoc] ---- @@ -629,6 +631,25 @@ Listens for vol2_clause_dev_23_message_hello messages to identify any <> to end a Distributed Alarm System. +Listens for notifications from a <> that end +a Distributed Alarm System. + +[actor-id="somds_medical_alert_provider",contribution=Responder,contribution=Initiator] +Listens for requests from a <> to end a +Distributed Alarm System and grants such requests. Alternatively ends a Distributed Alarm System +on its own initiative and notifies the <>. + +-- +---- + The transactions object identifier (oid) may <> using the `oid-arcs` attribute. If not present, object identifiers will be set automatically from the transaction id. When assigned automatically, two oids will be applied to each transaction: diff --git a/asciidoc/images/vol1-diagram-sdpi-a-actor.svg b/asciidoc/images/vol1-diagram-sdpi-a-actor.svg index bc9e1dd1..01814dfa 100644 --- a/asciidoc/images/vol1-diagram-sdpi-a-actor.svg +++ b/asciidoc/images/vol1-diagram-sdpi-a-actor.svg @@ -6,7 +6,7 @@ version="1.1" id="svg209" sodipodi:docname="vol1-diagram-sdpi-a-actor.svg" - inkscape:version="1.1.2 (b8e25be833, 2022-02-05)" + inkscape:version="1.3.2 (091e20e, 2023-11-25, custom)" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns="http://www.w3.org/2000/svg" @@ -27,14 +27,22 @@ inkscape:zoom="0.8609375" inkscape:cx="519.78221" inkscape:cy="264.24682" - inkscape:window-width="1620" - inkscape:window-height="1058" - inkscape:window-x="-6" - inkscape:window-y="-6" + inkscape:window-width="1920" + inkscape:window-height="1009" + inkscape:window-x="-8" + inkscape:window-y="-8" inkscape:window-maximized="1" - inkscape:current-layer="g207" /> + inkscape:current-layer="g207" + inkscape:showpageshadow="2" + inkscape:deskcolor="#d1d1d1" /> + @@ -70,21 +78,23 @@ font-family="Calibri, Calibri_MSFontService, sans-serif" font-weight="700" font-size="24px" - transform="translate(195.317,522)" - id="text11">SOMDS + id="text11" + x="185.317" + y="558">SOMDS Provider + id="text13" + x="180.67" + y="587">Provider @@ -92,27 +102,30 @@ font-family="Calibri, Calibri_MSFontService, sans-serif" font-weight="700" font-size="24px" - transform="translate(346.815,507)" - id="text17">SOMDS + id="text17" + x="336.815" + y="543">SOMDS Medical Alert + id="text19" + x="307.38901" + y="572">Medical Alert Provider + id="text21" + x="332.16901" + y="601">Provider @@ -120,21 +133,23 @@ font-family="Calibri, Calibri_MSFontService, sans-serif" font-weight="700" font-size="24px" - transform="translate(195.123,177)" - id="text25">SOMDS + id="text25" + x="185.123" + y="147">SOMDS Consumer + id="text27" + x="172.28999" + y="176">Consumer @@ -142,100 +157,136 @@ font-family="Calibri, Calibri_MSFontService, sans-serif" font-weight="700" font-size="24px" - transform="translate(346.341,163)" - id="text31">SOMDS + id="text31" + x="336.341" + y="133">SOMDS Medical Alert + id="text33" + x="306.914" + y="162">Medical Alert Consumer + id="text35" + x="323.50699" + y="191">Consumer + DEV + - DEV + id="text41" + x="193.30901" + y="225">38 Establish - + id="text43" + x="155.64301" + y="248">Medical Alert Exchange 38 Establish + id="text37-1" + x="156.52522" + y="435.74741">DEV Medical Alert Exchange + id="text39-8" + x="188.52522" + y="435.74741">- + 48 Establish + d="m 362,205.50817 -10e-5,299.63213 h 2 L 364,205.50817 Z m -3.0001,297.78515 4,11.08466 4,-11.08466 z" + id="path45" + style="stroke-width:1.1771" /> + d="m 385,511.88146 10e-5,-296.02987 h -2 L 383,511.88146 Z m 3.0001,-294.1924 -4,-11.01937 -4,11.01937 z" + id="path47" + style="stroke-width:1.17363" /> DEV + id="text49" + x="155.64301" + y="333">DEV - + id="text51" + x="187.64301" + y="333">- 41 Manage Medical + id="text53" + x="193.30901" + y="333">41 Manage Medical Alert Delegation + id="text55" + x="155.64301" + y="356">Alert Delegation DEV + id="text57" + x="401.08499" + y="312">DEV - + id="text59" + x="433.08499" + y="312">- 39 Publish + id="text61" + x="438.75101" + y="312">39 Publish Medical Alert Update + id="text63" + x="401.08499" + y="335">Medical Alert Update DEV + id="text95" + x="400.638" + y="364">DEV - + id="text97" + x="432.638" + y="364">- 42 Delegate + id="text99" + x="438.30499" + y="364">42 Delegate Medical Alert + id="text101" + x="400.638" + y="387">Medical Alert DEV + id="text103" + x="155.64301" + y="279">DEV - + id="text105" + x="187.64301" + y="279">- 40 Retrieve Medical + id="text107" + x="193.30901" + y="279">40 Retrieve Medical Alert Status + id="text109" + x="155.64301" + y="302">Alert Status DEV + id="text117" + x="155.642" + y="387">DEV + - - + id="text121" + x="193.30901" + y="387">43 Update Alert 43 Update Alert + id="text123" + x="155.642" + y="410">Acknowledgement Status Acknowledgement Status + id="text123-8" + x="157.09764" + y="457.42435">Distributed Alarm System + DEV + - + 49 End Distributed + Alarm System + DEV + - + 49 End Distributed + Alarm System 43 ) + diff --git a/asciidoc/plantuml/vol1-figure-sdpi-a-delegation-example-sequence-diagram.puml b/asciidoc/plantuml/vol1-figure-sdpi-a-delegation-example-sequence-diagram.puml index a1dc9b86..2f108440 100644 --- a/asciidoc/plantuml/vol1-figure-sdpi-a-delegation-example-sequence-diagram.puml +++ b/asciidoc/plantuml/vol1-figure-sdpi-a-delegation-example-sequence-diagram.puml @@ -16,6 +16,7 @@ group secured sdc_sp -> sdc_sp: annunciate alert sdc_sc <- sdc_sc: annunciate alert + ==Establish Distributed Alarm System== ==Delegate alert== loop sdc_sc -> sdc_sp: Delegation Heartbeat diff --git a/asciidoc/plantuml/vol2-figure-dev-48-sequence.puml b/asciidoc/plantuml/vol2-figure-dev-48-sequence.puml new file mode 100644 index 00000000..fc2cbd06 --- /dev/null +++ b/asciidoc/plantuml/vol2-figure-dev-48-sequence.puml @@ -0,0 +1,32 @@ +@startuml + +!include plantuml/common_style.inc.puml +autonumber + +!global $str_somds_medical_alert_consumer = "SOMDS Medical Alert Consumer" +!global $str_somds_medical_alert_provider = "SOMDS Medical Alert Provider" + +participant "$str_somds_medical_alert_consumer" as consumer +participant "$str_somds_medical_alert_provider" as provider + +==Establish Distributed Alarm System [DEV-48]== +consumer -> provider: ActivateMonitoredByDAS (Friendly Consumer Name) +consumer <<-- provider: ActivateMonitoredByDASResponse (MDIB version) + +par + loop upon alert condition change and before MaxTechnicalConfirmationDelay expires + consumer -> provider: ConfirmAlertsTechnicalDelivery (Alert Occurrence ID Tuple(s)) + consumer <<-- provider: ConfirmAlertsTechnicalDeliveryResponse + end +else + loop before InvocationEffectiveTimeout expires + consumer -> provider: ActivateMonitoredByDAS (Friendly Consumer Name) + consumer <<-- provider: ActivateMonitoredByDASResponse + end +else + loop at least once every SelfCheckPeriod + provider -> consumer: Notification (EpisodicAlertReport incl. updated 'SelfCheck' information) + end +end + +@enduml \ No newline at end of file diff --git a/asciidoc/plantuml/vol2-figure-dev-49-sequence.puml b/asciidoc/plantuml/vol2-figure-dev-49-sequence.puml new file mode 100644 index 00000000..c9d04f71 --- /dev/null +++ b/asciidoc/plantuml/vol2-figure-dev-49-sequence.puml @@ -0,0 +1,21 @@ +@startuml + +!include plantuml/common_style.inc.puml +autonumber + +!global $str_somds_medical_alert_consumer = "SOMDS Medical Alert Consumer" +!global $str_somds_medical_alert_provider = "SOMDS Medical Alert Provider" + +participant "$str_somds_medical_alert_consumer" as consumer +participant "$str_somds_medical_alert_provider" as provider + +==End Distributed Alarm System [DEV-49]== + +alt consumer initiates ending of the DAS + consumer -> provider: EndMonitoredByDAS + consumer <<-- provider: EndMonitoredByDASResponse +else provider initiates ending of the DAS + consumer <- provider: Notification (EpisodicOperationalStateReport incl. disabled operations 'MonitoredByDAS' and 'EndMonitoredByDAS') +end + +@enduml \ No newline at end of file diff --git a/asciidoc/sdpi-supplement.adoc b/asciidoc/sdpi-supplement.adoc index 175d739e..0c439721 100644 --- a/asciidoc/sdpi-supplement.adoc +++ b/asciidoc/sdpi-supplement.adoc @@ -24,8 +24,8 @@ // https://docs.asciidoctor.org/asciidoc/latest/attributes/unset-attributes/ :markup-actor-transactions-table: -:sdpi_milestone_publication: SDPi 2.3 Publication -:sdpi_milestone_review: SDPi 2.3 Review +:sdpi_milestone_publication: SDPi 2.4 Publication +:sdpi_milestone_review: SDPi 2.4 Review :sdpi_version_major: 2 :sdpi_version_minor: 4 @@ -34,7 +34,7 @@ :ihe_supplement_sdpi_revision_short: {sdpi_version_major}.{sdpi_version_minor} :ihe_supplement_sdpi_revision_date: {localdatetime} :ihe_supplement_sdpi_revision_label: Standard for Trial Use / Implementation -:ihe_supplement_sdpi_publication_month: December 19, 2025 +:ihe_supplement_sdpi_publication_month: March XX, 2026 :ihe_supplement_sdpi_public_comment_submission_deadline: N/A // Oid, assigned by IHE-DEV, for the SDPi specification diff --git a/asciidoc/volume0/tf0-ch-b-transactions.adoc b/asciidoc/volume0/tf0-ch-b-transactions.adoc index 781a5109..f8fe51c2 100644 --- a/asciidoc/volume0/tf0-ch-b-transactions.adoc +++ b/asciidoc/volume0/tf0-ch-b-transactions.adoc @@ -163,12 +163,20 @@ include::../volume2/dev-46/tf2-dev-46-summary.adoc[] .^| [[vol0_transaction_summary_dev_47,DEV-47 Retrieve Network Presence]] [[transaction_number_dev_47,DEV-47]] DEV-47 -| [[transaction_name_retrieve_network_presence,Retrieve Network Presence]] Retrieve Network Presence +| [[transaction_name_retrieve_network_presence,Retrieve Network Presence]] Retrieve Network Presence | include::../volume2/dev-47/tf2-dev-47-summary.adoc[] -.^| DEV-48 | _Reserved_ | -.^| DEV-49 | _Reserved_ | +.^| [[vol0_transaction_summary_dev_48, DEV-48 Establish Distributed Alarm System]][[transaction_number_dev_48, DEV-48]] DEV-48 +| [[transaction_name_establish_distributed_alarm_system, Establish Distributed Alarm System]] Establish Distributed Alarm System +| +include::../volume2/dev-48/tf2-dev-48-summary.adoc[] + +.^| [[vol0_transaction_summary_dev_49, DEV-49 End Distributed Alarm System]][[transaction_number_dev_49, DEV-49]] DEV-49 +| [[transaction_name_end_distributed_alarm_system, End Distributed Alarm System]] End Distributed Alarm System +| +include::../volume2/dev-49/tf2-dev-49-summary.adoc[] + .^| DEV-50 | _Reserved_ | |=== diff --git a/asciidoc/volume1/actor-tables/sdpi-a-transactions.adoc b/asciidoc/volume1/actor-tables/sdpi-a-transactions.adoc index 15b6fbc4..3a1f6105 100644 --- a/asciidoc/volume1/actor-tables/sdpi-a-transactions.adoc +++ b/asciidoc/volume1/actor-tables/sdpi-a-transactions.adoc @@ -9,7 +9,7 @@ .^|Optionality .^|Reference -.6+| <> +.8+| <> .^| <> .^| Responder .^| R @@ -43,7 +43,17 @@ | [DEV-43] Deferred to a future version of SDPi // <> -.6+| <> +| <> +| Responder +| R ^(See^ ^Note^ ^3)^ +| <> + +| <> +| Responder and Initiator +| R ^(See^ ^Note^ ^3)^ +| <> + +.8+| <> .^| <> .^| Initiator .^| R @@ -77,6 +87,16 @@ | [DEV-43] Deferred to a future version of SDPi // <> +| <> +| Initiator +| R ^(See^ ^Note^ ^3)^ +| <> + +| <> +| Responder and Initiator +| R ^(See^ ^Note^ ^3)^ +| <> + .4+| <> ^(See^ ^Note^ ^2)^ .^| <> .^| Initiator @@ -103,10 +123,11 @@ Note 1: Transaction is required if <> is supported. Note 2: By default, the <> acts as a <>, initiating [DEV-04] transactions when they are received from <>s. -This default configuration requires the grouped <> Actor to have the <> option selected. +This default configuration requires the grouped <> Actor to have the <> enabled. If the gateway supports <>, then it also acts as a <> and accepts inbound [DEV-04] transactions from ACM Alert Reporters. In this case, the gateway will support both "Initiator & Responder" for these transactions. -In this case, both the <> Actor <> and <> options are selected. +In this case, the <> Actor has both the <> and <> options selected. +Note 3: Transaction is required if <> is supported. |=== \ No newline at end of file diff --git a/asciidoc/volume1/tf1-ch-12-sdpi-a.adoc b/asciidoc/volume1/tf1-ch-12-sdpi-a.adoc index cf75bbba..be5b029c 100644 --- a/asciidoc/volume1/tf1-ch-12-sdpi-a.adoc +++ b/asciidoc/volume1/tf1-ch-12-sdpi-a.adoc @@ -1,4 +1,4 @@ -// = Service-oriented Device Point-of-care Interoperability - Alerting (SDPi-A) Profile +// = Service-oriented Device Point-of-care Interoperability – Alerting (SDPi-A) Profile [#vol1_clause_sdpi_a_profile,sdpi_offset=12,role=profile,profile-id=sdpi-a,reftext="Alerting Profile",oid-arcs=.13] == Service-oriented Device Point-of-care Interoperability – Alerting (SDPi-A) Profile @@ -12,7 +12,7 @@ Additionally, since the primary purpose of this specification is the communicati When this new standard is published, its requirements will be integrated into this supplement, with its <> added to <>. Many of those requirements will be mapped to the actors, transactions and other specifications in this specification. -Two of the transactions identified below, [DEV-41] and [DEV-42] are related to Medical Alert Delegation; however, at this stage there is considerable standards development activity to update the current <> standards, particularly in association with completing the Alert <> standard <>. +Two of the transactions identified below, [DEV-41] and [DEV-42] are related to Medical Alert Delegation; however, at this stage there is considerable standards development activity to update the current <> standards, particularly in association with completing the Alert <> standard <> and the External Control <> standard <>. As a result, the completion of these two transactions has been deferred to a subsequent version of the supplement. Similarly, a related transaction, [DEV-43], namely providing clinician alert acknowledgement status information back to the alerting device, is also being discussed further and will be deferred to a subsequent version of the supplement. @@ -29,10 +29,10 @@ The actors and transactions in this specification are specialized versions of th Additional services have been provided to specifically support the exchange and management of this medical device alert information, providing a high-level of reliability and performance, commensurate with the potential risk to the patient if they are not promptly addressed. The profile builds upon the foundational <> capabilities provided by the <>. -These extended capabilities for medical data exchange are achieved by various means, including: +These extended capabilities for medical alert exchange are achieved by various means, including: . Grouping <> actors with their <> counterparts -. Addressing requirements from the emerging <> IEEE standards: <> and <> +. Addressing requirements from the (emerging) <> IEEE standards: <>, <> and <> . Requiring capabilities that in the <> may be optional . Requiring additional <> data elements or content modules @@ -66,10 +66,14 @@ image::../images/vol1-diagram-sdpi-a-actor.svg[] sdpi_include_transaction::DEV-38[actor-id="somds_medical_alert_provider",responder="required"] sdpi_include_transaction::DEV-39[actor-id="somds_medical_alert_provider",initiator="required"] sdpi_include_transaction::DEV-40[actor-id="somds_medical_alert_provider",responder="required"] +sdpi_include_transaction::DEV-48[actor-id="somds_medical_alert_provider",responder="required"] +sdpi_include_transaction::DEV-49[actor-id="somds_medical_alert_provider",responder="optional",initiator="optional"] sdpi_include_transaction::DEV-38[actor-id="somds_medical_alert_consumer",initiator="required"] sdpi_include_transaction::DEV-39[actor-id="somds_medical_alert_consumer",responder="required"] sdpi_include_transaction::DEV-40[actor-id="somds_medical_alert_consumer",initiator="optional"] +sdpi_include_transaction::DEV-48[actor-id="somds_medical_alert_consumer",initiator="required"] +sdpi_include_transaction::DEV-49[actor-id="somds_medical_alert_consumer",responder="optional",initiator="optional"] sdpi_include_transaction::DEV-38[actor-id="somds_acm_gateway",responder="required"] sdpi_include_transaction::DEV-39[actor-id="somds_acm_gateway",initiator="required"] @@ -86,33 +90,8 @@ sdpi_include_transaction::DEV-43[actor-id="somds_medical_alert_consumer",initiat sdpi_include_transaction::DEV-43[actor-id="somds_acm_gateway",initiator="required",placeholder-name="Update alert acknowledgement status"] -ifdef::markup-actor-transactions-table[] - -[#vol1_table_sdpi_a_actors_transactions] -.SDPi-A Profile - Actors and Transactions -sdpi_transaction_table::[profile-id="sdpi-a"] - -[NOTE] -==== -* Transaction is required if <> is supported. - -* By default, the <> acts as a <>, initiating [DEV-04] transactions when they are received from <>s. -This default configuration requires the grouped <> Actor to have the <> option selected. - -If the gateway supports <>, then it also acts as a <> and accepts inbound [DEV-04] transactions from ACM Alert Reporters. -In this case, the gateway will support both "Initiator & Responder" for these transactions. -In this case, the <> Actor has both the <> and <> options selected. -==== - -endif::[] - -ifndef::markup-actor-transactions-table[] - -// Manual actors and transactions table: include::actor-tables/sdpi-a-transactions.adoc[] -endif::[] - [#vol1_clause_sdpi_a_actor_descriptions_actor_profile_requirements] ==== Actor Descriptions and Actor Profile Requirements @@ -207,6 +186,20 @@ If a <> is being created, it may incorporate both << [#vol1_clause_sdpi_a_actor_options] === SDPi-A Actor Options +[#vol1_clause_sdpi_a_actor_option_distributed_alarm_system,role=profile-option,profile-option-id=distributed_alarm_system,oid-arcs=".7"] +==== Distributed Alarm System Option + +[#vol1_clause_sdpi_a_actor_option_distributed_alarm_system_reftext, reftext='SDPi-A Option: Distributed Alarm System'] +This option enables <> and <> systems to safely and reliably run a Distributed Alarm System with each other. +This option enables both the <> [DEV-48] and <> [DEV-49] transactions. + +// Transaction obligations for distributed alarm system option. +sdpi_include_transaction::DEV-48[actor-id=somds_medical_alert_consumer,initiator=required] +sdpi_include_transaction::DEV-48[actor-id=somds_medical_alert_provider,responder=required] + +sdpi_include_transaction::DEV-49[actor-id=somds_medical_alert_consumer,initiator=required,receiver=required] +sdpi_include_transaction::DEV-49[actor-id=somds_medical_alert_provider,responder=required,initiator=required] + [#vol1_clause_sdpi_a_actor_option_alert_delegation,role=profile-option,profile-option-id=alert_delegation,oid-arcs=".4"] ==== Alert Delegation Option @@ -223,7 +216,7 @@ sdpi_include_transaction::DEV-42[actor-id="somds_medical_alert_consumer",respond [cols="1"] |=== a| *{supplement_note}*: This section is intentionally left incomplete to indicate capabilities that will be added in a future version of the SDPi Supplement. -As stated elsewhere, the completion of the <> standard is required before this profile can be completed (beyond alert reporting for DIS capabilities), and that is especially the case for alert delegation. +As stated elsewhere, the completion of the <> and <> standards is required before this profile can be fully completed (beyond alert reporting for DIS capabilities and DAS capabilities without delegation), and that is especially the case for alert delegation. *_The sequence diagram below for delegation is provided for informative purposes only and will be finalized when the IEEE standard and this profile option are completed._* @@ -249,7 +242,8 @@ include::../plantuml/vol1-figure-sdpi-a-delegation-example-sequence-diagram.puml .... -[#vol1_clause_sdpi_a_actor_option_alert_user_acknowledgement,role=profile-option,profile-option-id=alert_user_acknowledgement,oid-arcs=".5"] + +[#vol1_clause_sdpi_a_actor_option_alert_user_acknowledgement,role=profile-option,profile-option-id=alert_user_acknowledgement,oid-arcs=.5] ==== Alert User Acknowledgement Option [#vol1_clause_sdpi_a_actor_option_alert_user_acknowledgement_reftext, reftext='SDPi-A Option: Alert User Acknowledgement'] @@ -264,7 +258,7 @@ This option will enable the <> use case include: sdpi_support_use_case::somds_acm_gateway[support=optional] -[role="support-use-case", use-case-id="aars", oid-arcs=.3] +[role="support-use-case", use-case-id="aars", oid-arcs=.4] ===== <> (<>) This use case provides capabilities for requirements from <>. diff --git a/asciidoc/volume1/tf1-ch-2-overview.adoc b/asciidoc/volume1/tf1-ch-2-overview.adoc index 8aebcdb4..5e24f34b 100644 --- a/asciidoc/volume1/tf1-ch-2-overview.adoc +++ b/asciidoc/volume1/tf1-ch-2-overview.adoc @@ -148,7 +148,7 @@ Profile options are provided for additional capabilities that may be required to [sdpi_offset=12] ==== Service-oriented Device Point-of-care Interoperability - Alerting (SDPi-A) Profile The SDPi Alerting Profile builds on the basic <> capabilities of the <> profile, but adds the requirements to fully support *_medical alerting_*. -To that end, this specification implements the safety and security requirements of the <> alert <> standard (expected to be completed in 2025). +To that end, this specification implements the safety and security requirements of the <> alert <> standard (expected to be completed in 2026). The profile supports core medical alerting functionality needed by all participating systems. Profile options are provided for additional capabilities that may be required to support extended scenarios (e.g., alert delegation). @@ -170,7 +170,7 @@ It is *_not part of the capabilities specified for SDPi {ihe_supplement_sdpi_rev The SDPi External Control Profile builds on the basic <> capabilities of the <> Profile, but adds support for *_medical device external control capabilities_*. For example, the ability to have a system initiate a blood pressure reading, or set a breath rate, or titrate an infusion pump's delivery rate. -Given the significant risks associated with allowing device-external control functions in a network of <> systems, this specification implements the safety and security requirements of the <> external control <> standard (in development, anticipated in 2025 or later). +Given the significant risks associated with allowing device-external control functions in a network of <> systems, this specification implements the safety and security requirements of the <> external control <> standard (in development, anticipated in 2027). [sdpi_offset=5] diff --git a/asciidoc/volume2/dev-39/tf2-dev-39.adoc b/asciidoc/volume2/dev-39/tf2-dev-39.adoc index 038f9fc8..3677957f 100644 --- a/asciidoc/volume2/dev-39/tf2-dev-39.adoc +++ b/asciidoc/volume2/dev-39/tf2-dev-39.adoc @@ -35,6 +35,6 @@ While a subscription is running, the <> and a <>. \ No newline at end of file diff --git a/asciidoc/volume2/dev-48/tf2-dev-48.adoc b/asciidoc/volume2/dev-48/tf2-dev-48.adoc new file mode 100644 index 00000000..72a7bb35 --- /dev/null +++ b/asciidoc/volume2/dev-48/tf2-dev-48.adoc @@ -0,0 +1,165 @@ +:var_transaction_id: DEV-48 + +:var_label_dev_48_operation_act_monitored_by_das: ActivateMonitoredByDAS +:var_label_dev_48_operation_act_monitored_by_das_response: ActivateMonitoredByDASResponse +:var_label_dev_48_operation_confirm_alerts_technical_delivery: ConfirmAlertsTechnicalDelivery +:var_label_dev_48_operation_confirm_alerts_technical_delivery_response: ConfirmAlertsTechnicalDeliveryResponse +:var_label_dev_48_notification: Notification + +//reset|+1|off +[#vol2_clause_dev_48,sdpi_offset=48] +[role=transaction,transaction-id=DEV-48] +=== Establish Distributed Alarm System [{var_transaction_id}] + +==== Scope + +include::tf2-dev-48-summary.adoc[] + +==== Actor Roles + +[sdpi_transaction_actors] +-- +[actor-id="somds_medical_alert_consumer",contribution=Initiator] +Requests a <> to establish a Distributed Alarm System. +Also maintains an established Distributed Alarm System. +Receives notifications confirming Distributed Alarm System remains in effect. + +[actor-id="somds_medical_alert_provider",contribution=Responder] +Listens for requests from a <> to establish a +Distributed Alarm System and grants such requests. +Also maintains an established Distributed Alarm System. +-- + +==== Referenced Standards + +* <> + +==== Messages + +.Message Interaction Diagram [{var_transaction_id}] +[plantuml#vol2_figure_dev_48_sequence, target=puml-dev-48-sequence, format=svg] +.... +include::../../plantuml/vol2-figure-dev-48-sequence.puml[] +.... + +[#vol2_clause_dev_48_operation_act_monitored_by_das] +===== {var_label_dev_48_operation_act_monitored_by_das} Operation + +A <> invokes the {var_label_dev_48_operation_act_monitored_by_das} operation on a <> to either establish a Distributed Alarm System or to keep an established Distributed Alarm System active, as specified in <>. + +[#vol2_clause_dev_48_operation_act_monitored_by_das_trigger_events] +====== Trigger Events + +When there is no active Distributed Alarm System between a <> and a <>, the {var_label_dev_48_operation_act_monitored_by_das} operation is invoked by a <> to request the establishment of a Distributed Alarm System with the <>. + +When there is an active Distributed Alarm System between a <> and a <>, the {var_label_dev_48_operation_act_monitored_by_das} operation is periodically invoked by a <> with an interval shorter than the <>'s-defined _InvocationEffectiveTimeout_ to request to the <> that the Distributed Alarm System be kept active. + +[#vol2_clause_dev_48_operation_act_monitored_by_das_semantics] +====== Message Semantics + +[[payload_dev_48_act_monitored_by_das]]Friendly Consumer Name:: The Distributed Alarm System consumer name by which a <> wishes to be referred to by the <>. + +[#vol2_clause_dev_48_operation_act_monitored_by_das_expected_actions] +====== Expected Actions + +When a <> invokes this operation, the receiving <> responds with a <> message. + +[#vol2_clause_dev_48_operation_act_monitored_by_das_response] +===== {var_label_dev_48_operation_act_monitored_by_das_response} Operation Invoked Report Message + +A <> responds with a {var_label_dev_48_operation_act_monitored_by_das_response} message to a <>'s invocation of the {var_label_dev_48_operation_act_monitored_by_das} +operation, as specified in <>. + +[#vol2_clause_dev_48_operation_act_monitored_by_das_response_trigger_events] +====== Trigger Events + +The <> sends a {var_label_dev_48_operation_act_monitored_by_das_response} message back to the <> that invoked the {var_label_dev_48_operation_act_monitored_by_das} +operation. + +[#vol2_clause_dev_48_operation_act_monitored_by_das_response_semantics] +====== Message Semantics + +[[payload_dev_48_act_monitored_by_das_name]]MDIB version:: The version of the <>'s MDIB from which the <> takes over the Distributed Alarm System responsibility and therefore starts confirming changes in the <>'s alert conditions. + +NOTE: The described meaning of the MDIB version only applies to an {var_label_dev_48_operation_act_monitored_by_das_response} message sent in response to an (initial) invocation of the {var_label_dev_48_operation_act_monitored_by_das} operation for establishing the Distributed Alarm System. For {var_label_dev_48_operation_act_monitored_by_das_response} messages sent in response to periodic {var_label_dev_48_operation_act_monitored_by_das} operation invocation for Distributed Alarm System maintenance, the MDIB version does not have the described meaning. + + +[#vol2_clause_dev_48_operation_act_monitored_by_das_response_expected_actions] +====== Expected Actions + +When a <> sends this message, there is no expected or required response. + +When there is no active Distributed Alarm System between a <> and a <>, a {var_label_dev_48_operation_act_monitored_by_das_response} message with InvocationState = 'Fin' marks the establishment of the Distributed Alarm System for both the <> and the <>. + +When there is an active Distributed Alarm System between a <> and a <>, a {var_label_dev_48_operation_act_monitored_by_das_response} message with InvocationState = 'Fin' successfully closes a maintenance loop to keep the Distributed Alarm System active. + +[#vol2_clause_dev_48_operation_confirm_alerts_technical_delivery] +===== {var_label_dev_48_operation_confirm_alerts_technical_delivery} Operation + +A <> invokes the {var_label_dev_48_operation_confirm_alerts_technical_delivery} operation on a <> to keep an established Distributed Alarm System active, as specified in <>. + +[#vol2_clause_dev_48_operation_confirm_alerts_technical_delivery_trigger_events] +====== Trigger Events + +The {var_label_dev_48_operation_confirm_alerts_technical_delivery} operation is invoked by a <> to request to the <> that the Distributed Alarm System be kept active. + +NOTE: The invocation must occur once right after the establishment of the Distributed Alarm System. In addition, the invocation must occur upon specific changes of the <>'s alert conditions - further specified in <> - within an interval shorter than the <>'s-defined _MaxTechnicalConfirmationDelay_. + +[#vol2_clause_dev_48_operation_confirm_alerts_technical_delivery_semantics] +====== Message Semantics + +[[payload_dev_48_confirm_alerts_technical_delivery]]Alert Occurrence ID Tuple(s):: The set(s) of attributes describing the state of each of the alert conditions that the <> is confirming for technical delivery. + +[#vol2_clause_dev_48_operation_confirm_alerts_technical_delivery_expected_actions] +====== Expected Actions + +When a <> invokes this operation, the receiving <> responds with a <> message. + +[#vol2_clause_dev_48_operation_confirm_alerts_technical_delivery_response] +===== {var_label_dev_48_operation_confirm_alerts_technical_delivery_response} Operation Invoked Report Message + +The <> sends a {var_label_dev_48_operation_confirm_alerts_technical_delivery_response} message to respond to the <> that invoked the {var_label_dev_48_operation_confirm_alerts_technical_delivery} operation. + + +[#vol2_clause_dev_48_operation_confirm_alerts_technical_delivery_response_trigger_events] +====== Trigger Events + +A <> responds with a {var_label_dev_48_operation_confirm_alerts_technical_delivery_response} message upon a <>'s invocation of the {var_label_dev_48_operation_confirm_alerts_technical_delivery} operation. + +[#vol2_clause_dev_48_operation_confirm_alerts_technical_delivery_response_semantics] +====== Message Semantics + +The {var_label_dev_48_operation_confirm_alerts_technical_delivery_response} message does not contain any further semantics. + +[#vol2_clause_dev_48_operation_confirm_alerts_technical_delivery_response_expected_actions] +====== Expected Actions + +When a <> sends this message, there is no expected or required response. + +When there is an active Distributed Alarm System between a <> and a <>, a {var_label_dev_48_operation_confirm_alerts_technical_delivery_response} message with InvocationState = 'Fin' successfully closes a maintenance loop to keep the Distributed Alarm System active. + +[#vol2_clause_dev_48_notification] +===== {var_label_dev_48_notification} Message + +A <> uses the {var_label_dev_48_notification} message to keep an established Distributed Alarm System active, as specified in <>. + +[#vol2_clause_dev_48_notification_trigger_events] +====== Trigger Events + +The {var_label_dev_48_notification} message is sent by a <> to a <> so that the Distributed Alarm System be kept active. The sending must occur within an interval shorter than the <>'s-defined _SelfCheckPeriod_. + +[#vol2_clause_dev_48_notification_semantics] +====== Message Semantics + +[[payload_dev_48_notification]]EpisodicAlertReport:: A change report that contains the <>'s updated 'SelfCheck' information as specified in <>. The <> that receives this message uses the contained information to determine <>'s capability (and willingness) to keep the Distributed Alarm System active. + +[#vol2_clause_dev_48_notification_expected_actions] +====== Expected Actions + +When a <> sends this message, there is no expected or required response. + +When there is an active Distributed Alarm System between a <> and a <>, a {var_label_dev_48_notification} message successfully closes a maintenance loop to keep the Distributed Alarm System active. + +[#vol2_clause_dev_48_publish_medical_alert_update_ses] +include::../dev-x-default-ses-secured-mode.adoc[] + diff --git a/asciidoc/volume2/dev-49/tf2-dev-49-summary.adoc b/asciidoc/volume2/dev-49/tf2-dev-49-summary.adoc new file mode 100644 index 00000000..fb8e90c7 --- /dev/null +++ b/asciidoc/volume2/dev-49/tf2-dev-49-summary.adoc @@ -0,0 +1,3 @@ +// DEV-49 Transaction Summary + +Intentionally end the Distributed Alarm System between a <> and a <>. \ No newline at end of file diff --git a/asciidoc/volume2/dev-49/tf2-dev-49.adoc b/asciidoc/volume2/dev-49/tf2-dev-49.adoc new file mode 100644 index 00000000..d5be6580 --- /dev/null +++ b/asciidoc/volume2/dev-49/tf2-dev-49.adoc @@ -0,0 +1,112 @@ +:var_transaction_id: DEV-49 + +:var_label_dev_49_operation_end_monitored_by_das: EndMonitoredByDAS +:var_label_dev_49_operation_end_monitored_by_das_response: EndMonitoredByDASResponse +:var_label_dev_49_notification: Notification + +//reset|+1|off +[#vol2_clause_dev_49,sdpi_offset=49] +[role=transaction,transaction-id=DEV-49] +=== End Distributed Alarm System [{var_transaction_id}] + +==== Scope + +include::tf2-dev-49-summary.adoc[] + +==== Actor Roles + +[sdpi_transaction_actors] +-- + +[actor-id="somds_medical_alert_consumer",contribution=Initiator,contribution=Receiver] +Requests a <> to end a Distributed Alarm System. +Listens for notifications that the <> has ended +the Distributed Alarm System. + + +[actor-id="somds_medical_alert_provider",contribution=Responder,contribution=Initiator] +Listens for requests from a <> to end the +Distributed Alarm System and grants such requests. Alternatively ends the Distributed Alarm System +on its own initiative and notifies the <>. + +-- + +==== Referenced Standards + +* <> + +==== Messages + +.Message Interaction Diagram [{var_transaction_id}] +[plantuml#vol2_figure_dev_49_sequence, target=puml-dev-49-sequence, format=svg] +.... +include::../../plantuml/vol2-figure-dev-49-sequence.puml[] +.... + +[#vol2_clause_dev_49_operation_end_monitored_by_das] +===== {var_label_dev_49_operation_end_monitored_by_das} Operation + +A <> invokes the {var_label_dev_49_operation_end_monitored_by_das} operation on a <> to initiate a graceful ending of the Distributed Alarm System, as specified in <>. + +[#vol2_clause_dev_49_operation_end_monitored_by_das_trigger_events] +====== Trigger Events + +When there is an active Distributed Alarm System between a <> and a <>, the {var_label_dev_49_operation_end_monitored_by_das} operation is invoked by the <> to request the <> to end the Distributed Alarm System. + +[#vol2_clause_dev_49_operation_end_monitored_by_das_semantics] +====== Message Semantics + +The {var_label_dev_49_operation_end_monitored_by_das} operation does not contain any further semantics. + +[#vol2_clause_dev_49_operation_end_monitored_by_das_expected_actions] +====== Expected Actions + +When a <> invokes the {var_label_dev_49_operation_end_monitored_by_das} operation, the receiving <> responds with a {var_label_dev_49_operation_end_monitored_by_das_response} message. + +[#vol2_clause_dev_49_operation_end_monitored_by_das_response] +===== {var_label_dev_49_operation_end_monitored_by_das_response} Operation Invoked Report Message + +A <> responds with a {var_label_dev_49_operation_end_monitored_by_das_response} message to a <>'s invocation of the {var_label_dev_49_operation_end_monitored_by_das} operation, as specified in <>. + +[#vol2_clause_dev_49_operation_end_monitored_by_das_response_trigger_events] +====== Trigger Events + +The <> sends a {var_label_dev_49_operation_end_monitored_by_das_response} message back to the <> that invoked the {var_label_dev_49_operation_end_monitored_by_das} operation. + +[#vol2_clause_dev_49_operation_end_monitored_by_das_response_semantics] +====== Message Semantics + +The {var_label_dev_49_operation_end_monitored_by_das_response} message does not contain any further semantics. + +[#vol2_clause_dev_49_operation_end_monitored_by_das_response_expected_actions] +====== Expected Actions + +When a <> sends this message, there is no expected or required response from the <>. + +A {var_label_dev_49_operation_end_monitored_by_das_response} message with InvocationState = 'Fin' marks the end of the Distributed Alarm System between the <> and the <>. + +[#vol2_clause_dev_49_notification] +===== {var_label_dev_49_notification} Message + +A <> uses the {var_label_dev_49_notification} message to initiate a graceful ending of the Distributed Alarm System, as specified in <>. + +[#vol2_clause_dev_49_notification_trigger_events] +====== Trigger Events + +When a <> ends the Distributed Alarm System with a specific <>, it sends a {var_label_dev_49_notification} message to that <> to inform it that the Distributed Alarm System has ended. + +[#vol2_clause_dev_49_notification_semantics] +====== Message Semantics + +[[payload_dev_49_notification]]EpisodicOperationalStateReport:: A change report that contains information on the disablement (OperatingMode = 'Dis') of the operations with codes MDC_ACT_MONITORED_BY_DISTRIBUTED_ALARM_SYSTEM and MDC_ACT_END_MONITORED_BY_DISTRIBUTED_ALARM_SYSTEM. + +[#vol2_clause_dev_49_notification_expected_actions] +====== Expected Actions + +When a <> sends a {var_label_dev_49_notification} message, there is no expected or required response from the <>. + +A {var_label_dev_49_notification} message with the aforementioned message semantics marks the end of the Distributed Alarm System between the <> and the <>. + +[#vol2_clause_dev_49_publish_medical_alert_update_ses] +include::../dev-x-default-ses-secured-mode.adoc[] + diff --git a/asciidoc/volume2/tf2-main.adoc b/asciidoc/volume2/tf2-main.adoc index 94670d03..18320a34 100644 --- a/asciidoc/volume2/tf2-main.adoc +++ b/asciidoc/volume2/tf2-main.adoc @@ -57,6 +57,12 @@ include::dev-46/tf2-dev-46.adoc[] //=== Retrieve Network Presence [DEV-47] include::dev-47/tf2-dev-47.adoc[] +//=== Establish Distributed Alarm System [DEV-48] +include::dev-48/tf2-dev-48.adoc[] + +//=== End Distributed Alarm System [DEV-49] +include::dev-49/tf2-dev-49.adoc[] + // TODO how does this differ from DEV-30 // //[appendix#clause-mdpws-constraints-corrigenda-adjuncts]