Skip to content

Commit

Permalink
introduce semantic response buttons
Browse files Browse the repository at this point in the history
  • Loading branch information
svengcz committed May 4, 2022
1 parent 3154369 commit bd14a79
Show file tree
Hide file tree
Showing 2 changed files with 115 additions and 11 deletions.
78 changes: 78 additions & 0 deletions src/instruments/src/DCDU/elements/SemanticResponseButtons.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
import React from 'react';
import { AtsuMessageComStatus } from '@atsu/messages/AtsuMessage';
import { CpdlcMessage } from '@atsu/messages/CpdlcMessage';
import { UplinkMessageInterpretation } from '@atsu/components/UplinkMessageInterpretation';
import { Button } from './Button';

type SemanticResponseButtonsProps = {
message: CpdlcMessage,
dataIncomplete: boolean,
invertResponse: (message: number) => void,
sendMessage: (message: number) => void,
closeMessage: (message: number) => void
}

export const SemanticResponseButtons: React.FC<SemanticResponseButtonsProps> = ({ message, dataIncomplete, invertResponse, sendMessage, closeMessage }) => {
const showAnswers = message.Response === undefined || (message.Response.ComStatus !== AtsuMessageComStatus.Sending && message.Response.ComStatus !== AtsuMessageComStatus.Sent);
const buttonsBlocked = message.Response !== undefined && message.Response.ComStatus === AtsuMessageComStatus.Sending;

const clicked = (index: string) : void => {
if (message.UniqueMessageID === undefined || buttonsBlocked) {
return;
}

if (showAnswers) {
if (index === 'L1') {
invertResponse(message.UniqueMessageID);
} else if (index === 'R2' && message.Response) {
sendMessage(message.Response.UniqueMessageID);
}
// TODO process R1 and modify the message
} else if (index === 'R2') {
closeMessage(message.UniqueMessageID);
}
};

return (
<>
{showAnswers && (
<>
{UplinkMessageInterpretation.HasNegativeResponse(message) && (
<>
<Button
messageId={message.UniqueMessageID}
index="L1"
content="CANNOT"
active={!buttonsBlocked && !dataIncomplete}
onClick={clicked}
/>
</>
)}
<Button
messageId={message.UniqueMessageID}
index="R1"
content="MODIFY"
active={!buttonsBlocked}
onClick={clicked}
/>
<Button
messageId={message.UniqueMessageID}
index="R2"
content="SEND"
active={!dataIncomplete}
onClick={clicked}
/>
</>
)}
{!showAnswers && (
<Button
messageId={message.UniqueMessageID}
index="R2"
content="CLOSE"
active={!buttonsBlocked}
onClick={clicked}
/>
)}
</>
);
};
48 changes: 37 additions & 11 deletions src/instruments/src/DCDU/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import { RequestMessage } from '@atsu/messages/RequestMessage';
import { DclMessage } from '@atsu/messages/DclMessage';
import { OclMessage } from '@atsu/messages/OclMessage';
import { DcduStatusMessage } from '@atsu/components/DcduLink';
import { SemanticResponseButtons } from './elements/SemanticResponseButtons';
import { OutputButtons } from './elements/OutputButtons';
import { AffirmNegativeButtons } from './elements/AffirmNegativeButtons';
import { WilcoUnableButtons } from './elements/WilcoUnableButtons';
Expand Down Expand Up @@ -47,6 +48,8 @@ export class DcduMessageBlock {

public automaticCloseTimeout: number = -1;

public semanticResponse: boolean = false;

public semanticResponseIncomplete: boolean = false;
}

Expand Down Expand Up @@ -92,6 +95,9 @@ const DCDU: React.FC = () => {
const sendResponse = (uid: number, response: number) => events.triggerToAllSubscribers('A32NX_ATSU_SEND_RESPONSE', uid, response);

// functions to handle the internal queue
const invertResponse = (uid: number) => {
events.triggerToAllSubscribers('A32NX_ATSU_DCDU_MESSAGE_INVERT_SEMANTIC_RESPONSE', uid);
};
const recallMessage = () => {
events.triggerToAllSubscribers('A32NX_ATSU_DCDU_MESSAGE_RECALL');
};
Expand Down Expand Up @@ -245,10 +251,12 @@ const DCDU: React.FC = () => {

// check if we have a semantic response and all data is available
if (UplinkMessageInterpretation.SemanticAnswerRequired(cpdlcMessages[0]) && cpdlcMessages[0].Response && cpdlcMessages[0].Response.Content) {
for (const entry of cpdlcMessages[0].Response.Content.Content) {
if (entry.Value === '') {
const dcduBlock = messages.get(cpdlcMessages[0].UniqueMessageID);
if (dcduBlock) {
const dcduBlock = messages.get(cpdlcMessages[0].UniqueMessageID);
if (dcduBlock) {
dcduBlock.semanticResponse = true;

for (const entry of cpdlcMessages[0].Response.Content.Content) {
if (entry.Value === '') {
dcduBlock.semanticResponseIncomplete = true;
dcduBlock.statusMessage = DcduStatusMessage.NoFmData;
break;
Expand Down Expand Up @@ -345,17 +353,20 @@ const DCDU: React.FC = () => {

// prepare the data
let messageIndex = -1;
let visibleMessagesSemanticResponseIncomplete: boolean = false;
let visibleMessageSemanticButtonNeeded: boolean = false;
let visibleMessages: CpdlcMessage[] | undefined = undefined;
let visibleMessageStatus: DcduStatusMessage = DcduStatusMessage.NoMessage;
let response: number = -1;
const response: number = -1;
if (state === DcduState.On && messages.size !== 0) {
const arrMessages = sortedMessageArray(messages);

messageIndex = arrMessages.findIndex((element) => element.messageVisible);
if (messageIndex !== -1) {
visibleMessages = arrMessages[messageIndex].messages;
visibleMessageStatus = arrMessages[messageIndex].statusMessage;
response = arrMessages[messageIndex].response;
visibleMessageSemanticButtonNeeded = arrMessages[messageIndex].semanticResponse;
visibleMessagesSemanticResponseIncomplete = arrMessages[messageIndex].semanticResponseIncomplete;
}

// check if PRIORITY MSG + needs to be visualized
Expand Down Expand Up @@ -421,7 +432,8 @@ const DCDU: React.FC = () => {
/>
</>
))}
{(visibleMessages !== undefined && answerRequired && visibleMessages[0].Content?.ExpectedResponse === CpdlcMessageExpectedResponseType.WilcoUnable && (
{(visibleMessages !== undefined && answerRequired && !visibleMessageSemanticButtonNeeded
&& visibleMessages[0].Content?.ExpectedResponse === CpdlcMessageExpectedResponseType.WilcoUnable && (
<WilcoUnableButtons
message={visibleMessages[0]}
selectedResponse={response}
Expand All @@ -430,7 +442,8 @@ const DCDU: React.FC = () => {
closeMessage={closeMessage}
/>
))}
{(visibleMessages !== undefined && answerRequired && visibleMessages[0].Content?.ExpectedResponse === CpdlcMessageExpectedResponseType.AffirmNegative && (
{(visibleMessages !== undefined && answerRequired && visibleMessageSemanticButtonNeeded
&& visibleMessages[0].Content?.ExpectedResponse === CpdlcMessageExpectedResponseType.AffirmNegative && (
<AffirmNegativeButtons
message={visibleMessages[0]}
selectedResponse={response}
Expand All @@ -439,7 +452,8 @@ const DCDU: React.FC = () => {
closeMessage={closeMessage}
/>
))}
{(visibleMessages !== undefined && answerRequired && visibleMessages[0].Content?.ExpectedResponse === CpdlcMessageExpectedResponseType.Roger && (
{(visibleMessages !== undefined && answerRequired && visibleMessageSemanticButtonNeeded
&& visibleMessages[0].Content?.ExpectedResponse === CpdlcMessageExpectedResponseType.Roger && (
<RogerButtons
message={visibleMessages[0]}
selectedResponse={response}
Expand All @@ -448,15 +462,27 @@ const DCDU: React.FC = () => {
closeMessage={closeMessage}
/>
))}
{(visibleMessages !== undefined && !answerRequired && visibleMessages[0].Direction === AtsuMessageDirection.Downlink && (
{(visibleMessages !== undefined && !answerRequired && visibleMessageSemanticButtonNeeded
&& visibleMessages[0].Direction === AtsuMessageDirection.Downlink && (
<OutputButtons
message={visibleMessages[0]}
sendMessage={sendMessage}
deleteMessage={deleteMessage}
closeMessage={closeMessage}
/>
))}
{(visibleMessages !== undefined && !answerRequired && visibleMessages[0].Direction === AtsuMessageDirection.Uplink && (
{(visibleMessages !== undefined && visibleMessageSemanticButtonNeeded
&& visibleMessages[0].Direction === AtsuMessageDirection.Uplink && (
<SemanticResponseButtons
message={visibleMessages[0]}
dataIncomplete={visibleMessagesSemanticResponseIncomplete}
invertResponse={invertResponse}
sendMessage={sendMessage}
closeMessage={closeMessage}
/>
))}
{(visibleMessages !== undefined && !answerRequired && !visibleMessageSemanticButtonNeeded
&& visibleMessages[0].Direction === AtsuMessageDirection.Uplink && (
<CloseButtons
message={visibleMessages[0]}
closeMessage={closeMessage}
Expand Down

0 comments on commit bd14a79

Please sign in to comment.