본문으로 건너뛰기

서비스 인터페이스

이 장에서 할 일​

이 장에서는 데이터 타입을 마친 프로젝트 AADesign 에 서비스 인터페이스 하나를 만든다. Interface 편집기의 SERVICE 탭에서 + 버튼으로 인터페이스 Sensor(C++ 네임스페이스 sensor::service, 버전 1 / 0)를 추가하고, 이벤트 SensorData(타입 ByteArray)와 메서드 Calculation(REQUEST AND RESPONSE, IN 인자 front, rear, left, right 와 OUT 인자 result, 타입은 모두 float32)을 넣은 뒤 저장한다.

이 장을 마치면 design/INTERFACE.io.model 파일이 새로 생기고 그 안에 서비스 인터페이스 Sensor 하나가 저장된다. VALIDATION 패널은 이 장 내내 No validation issues. 이다. 뒤의 SOME/IP 배포와 서비스 인스턴스에서 이 인터페이스에 SOME/IP 배포를 붙이고, Adaptive Application 과 포트에서 세 AA 의 포트가 이 인터페이스를 쓴다.

시작하기 전에​

  • 데이터 타입을 마친 상태에서 시작한다. 창 제목이 PAIO [AADesign] 이고, 프로젝트의 design/ 폴더에는 DATATYPE.io.model(ByteArray, String), IVC.io.model, SYSTEM.io.model, VFB.io.model 과 Module/, SWC/ 가 있으며 INTERFACE.io.model 과 SERVICE.io.model 은 아직 없다. VALIDATION 패널은 No validation issues. 이다.
  • 4장에서 열어 둔 AADesign:DataType 탭은 닫아도 된다. 이 장은 EDITOR 뷰의 DESIGN 에서 Interface 를 열어 시작한다.

이 장에서 입력하거나 고르는 값은 다음과 같다. DESCRIPTION 은 모두 비워 두고, MAJOR VERSION / MINOR VERSION 과 METHOD TYPE 은 기본값을 그대로 둔다.

요소NAME그 밖의 값
서비스 인터페이스SensorC++ NAMESPACE sensor::service, MAJOR VERSION 1, MINOR VERSION 0 (기본값)
이벤트SensorDataTYPE 드롭다운에서 ByteArray 선택
메서드CalculationMETHOD TYPE REQUEST AND RESPONSE (기본값)

메서드 Calculation 의 인자 다섯 개는 다음 순서로 만든다.

#DIRECTIONTYPENAME
1IN (기본값)float32front
2IN (기본값)float32rear
3IN (기본값)float32left
4IN (기본값)float32right
5OUT (드롭다운에서 선택)float32result

참고. NAME 입력란은 Enter 키를 누르거나 칸에서 빠져나와야 값이 확정된다. 이 장에서는 이름을 입력한 뒤 Enter 키를, C++ NAMESPACE 는 입력한 뒤 Tab 키를 누른다. 드롭다운과 METHOD TYPE 세그먼트의 선택은 클릭 즉시 확정된다.

Interface 편집기 열기​

편집기 열고 SERVICE 탭 확인하기​

  1. 왼쪽 EDITOR 뷰의 DESIGN 아래에서 Interface 를 클릭한다. 탭 AADesign:Interface 가 열린다.

  2. 편집기 위쪽의 카테고리 탭 일곱 개 SERVICE, SENDER-RECEIVER, CLIENT-SERVER, MODE-SWITCH, ADAPTIVE, ERROR DOMAIN, MAPPING 을 본다. 열자마자 SERVICE 탭이 활성이다. 이 장은 SERVICE 탭만 쓴다.

  3. 세 패널을 본다. 왼쪽 INTERFACES 목록은 비어 있어 Add an interface 가, 가운데 CONFIGURATION 은 Select an interface 가, 오른쪽 SOA DEPLOYMENT 서브탭은 Select a service interface 가 보인다.

    Interface 편집기를 열어 SERVICE 탭이 활성인 화면

    그림 5-1. 처음 연 Interface 편집기. ① EDITOR 뷰 DESIGN 의 Interface 행, ② 활성인 SERVICE 카테고리 탭, ③ INTERFACES 머리글의 + 버튼(툴팁 Add Interface). 오른쪽 패널에는 서브탭 SOA DEPLOYMENT, SERVICE INSTANCE, DATA TYPE 이 있고 SOA DEPLOYMENT 가 활성이다.

왼쪽 INTERFACES 머리글에는 +(Add Interface), −, ⋯ 버튼과 검색 칸(안내 search...)이 있다. 이 장에서는 + 버튼과 CONFIGURATION 패널만 쓴다. 다른 여섯 카테고리 탭, −, ⋯, 검색 칸, 오른쪽 SERVICE INSTANCE 서브탭은 쓰지 않는다.

참고. 참조 설계의 Interface 파일에 든 요소는 서비스 인터페이스 Sensor 하나뿐이다. SENDER-RECEIVER 등 다른 여섯 탭은 이 튜토리얼에서 끝까지 비어 있다.

서비스 인터페이스 Sensor 만들기​

인터페이스 추가하기​

  1. INTERFACES 머리글의 + 버튼을 클릭한다. 목록에 새 항목 ServiceInterface_0 이 생기고 바로 선택된다.

  2. CONFIGURATION 패널을 본다. NAME 은 ServiceInterface_0, C++ NAMESPACE 는 빈 칸(안내 C++ Namespace (e.g., paio::api)), MAJOR VERSION 은 1, MINOR VERSION 은 0, DESCRIPTION 은 빈 칸(안내 Text)이다. 그 아래에 서브탭 EVENTS, METHODS, FIELDS 와 줄 오른쪽 끝의 + 버튼이 있고, EVENTS 가 활성이라 Add an event 가 보인다.

    + 버튼으로 새 인터페이스 ServiceInterface_0 을 추가한 직후의 편집기

    그림 5-2. 인터페이스를 추가한 직후의 편집기. ① 목록의 ServiceInterface_0 행, ② NAME = ServiceInterface_0, ③ 빈 C++ NAMESPACE 칸, ④ MAJOR VERSION = 1 과 MINOR VERSION = 0. 오른쪽 SOA DEPLOYMENT 패널은 No deployments configured 로 바뀌고, 그림 밖의 탭 AADesign:Interface 에는 수정됨 표시 ● 가 붙는다.

새 인터페이스의 이름은 ServiceInterface_0 처럼 자동으로 정해진다. 오른쪽 SOA DEPLOYMENT 패널의 No deployments configured 는 SOME/IP 배포와 서비스 인스턴스에서 채운다.

이름과 네임스페이스 입력하기​

  1. NAME 입력란의 값을 Sensor 로 바꾸고 Enter 키를 누른다. 목록의 행도 Sensor 로 바뀐다.

  2. C++ NAMESPACE 입력란에 sensor::service 를 입력하고 Tab 키를 누른다.

  3. MAJOR VERSION 1 과 MINOR VERSION 0 은 그대로 둔다. 참조 설계와 같은 값이다.

    이름과 C++ 네임스페이스를 넣은 인터페이스 Sensor

    그림 5-3. 기본 정보를 넣은 인터페이스 Sensor. ① NAME = Sensor, ② C++ NAMESPACE = sensor::service, ③ MAJOR VERSION = 1 과 MINOR VERSION = 0, ④ 활성인 EVENTS 서브탭. 목록의 행은 Sensor 이고 DESCRIPTION 은 빈 칸이다.

이벤트 SensorData 추가하기​

이벤트 추가하고 이름 입력하기​

  1. 서브탭 EVENTS 가 활성인지 확인한다. 서브탭 줄 오른쪽 끝의 + 버튼(툴팁 Add Event)을 클릭한다. 열 머리글 NAME, TYPE, DESCRIPTION 아래에 새 행 Event_0 이 생기고, TYPE 은 uint8 이며, 행이 펼쳐져 아래에 상세 칸 NAME, TYPE, DESCRIPTION 이 보인다.
  2. 상세의 NAME 입력란의 값을 SensorData 로 바꾸고 Enter 키를 누른다. 행 머리글도 SensorData 로 바뀐다.

새 이벤트의 이름은 Event_0 처럼, 타입은 uint8 로 자동으로 정해진다. 행 머리글을 클릭하면 상세가 접히고 다시 클릭하면 펼쳐진다.

타입 ByteArray 고르기​

  1. 상세의 TYPE 칸 오른쪽 끝의 ⌄ 를 클릭한다. 검색 칸(안내 Type to search...)과 드롭다운이 열린다. 드롭다운에는 프리미티브 11개 boolean, float32, float64, sint8, sint16, sint32, sint64, uint8, uint16, uint32, uint64 와 4장에서 만든 ByteArray, String 이 이 순서로 모두 13개 있고, 현재값 uint8 행에 ✓ 가 있다. 한 번에 여섯 행쯤 보이므로 스크롤해 ByteArray 를 찾는다.

  2. 드롭다운에서 ByteArray 를 클릭한다.

    이벤트 SensorData 의 TYPE 드롭다운을 연 EVENTS 표

    그림 5-4. TYPE 드롭다운을 연 EVENTS 표. ① 활성인 EVENTS 서브탭, ② 줄 오른쪽 끝의 + 버튼(툴팁 Add Event), ③ 상세의 NAME 칸 = SensorData, ④ 드롭다운에서 클릭할 ByteArray 행. 드롭다운에는 uint8 ✓, uint16, uint32, uint64, ByteArray, String 행이 보이고 오른쪽에 스크롤바가 있다.

  3. 행 머리글이 SensorData ByteArray 로 바뀐 것을 확인한다. 오른쪽 패널이 DATA TYPE 서브탭으로 저절로 바뀌어 고른 타입 ByteArray 의 내용을 보여 준다.

    이벤트 SensorData 를 완성한 편집기와 오른쪽의 DATA TYPE 패널

    그림 5-5. 이벤트 SensorData 를 완성한 편집기. ① EVENTS 표의 SensorData ByteArray 행과 그 상세(NAME = SensorData, TYPE = ByteArray), ② 오른쪽의 DATA TYPE 패널. 패널에는 NAME ByteArray, C++ NAMESPACE aa::type, CATEGORY 에서 선택된 DYNAMIC_ARRAY, ELEMENT TYPE uint8, MAX SIZE 1 이 있고, 아래 PREVIEW 에는 ByteArray, uint8[..1] (Dynamic), [0] uint8, 0..1 elements | max 1 bytes 가 보인다.

참고. 이벤트나 인자의 타입을 고르면 오른쪽 패널이 DATA TYPE 서브탭으로 바뀐다. 이 서브탭은 패널 안에 들어 있는 DataType 편집기로, 고른 타입을 보여 준다. float32 같은 내장 프리미티브는 여기서 읽기 전용이지만, ByteArray 처럼 이 프로젝트에서 만든 타입은 여기서도 고칠 수 있다. 고치면 타입 자체가 바뀌고, 탭 AADesign:Interface 에 수정됨 표시 ● 가 붙으며, 그 탭에서 Ctrl+S 를 누를 때 함께 저장된다. 이 장에서는 여기서 아무것도 바꾸지 않는다. SOA DEPLOYMENT 로 돌아가려면 그 서브탭을 다시 클릭한다. 드롭다운에는 DataType 편집기에 있는 타입만 나오므로 ByteArray 는 데이터 타입에서 먼저 만들어 두었다.

메서드 Calculation 추가하기​

메서드 추가하기​

  1. 서브탭 METHODS 를 클릭한다. 표가 비어 있어 Add a method 가 보인다.

  2. 서브탭 줄 오른쪽 끝의 + 버튼(툴팁 Add Method)을 클릭한다. 열 머리글 NAME, ARGS, ACCESS, DESCRIPTION 아래에 새 행 Method_0 이 생기고, ARGS 는 () → ErrorCode, ACCESS 는 배지 R&R 이며, 행이 펼쳐져 상세가 보인다.

  3. 상세의 NAME 입력란의 값을 Calculation 으로 바꾸고 Enter 키를 누른다. 행 머리글도 Calculation 으로 바뀐다.

  4. METHOD TYPE 세그먼트는 REQUEST AND RESPONSE 가 선택된 그대로 둔다.

    메서드 Calculation 을 추가한 직후의 METHODS 표

    그림 5-6. 메서드 Calculation 을 추가한 직후의 METHODS 표. ① 활성인 METHODS 서브탭, ② 줄 오른쪽 끝의 + 버튼(툴팁 Add Method), ③ 상세의 NAME 칸 = Calculation, ④ METHOD TYPE 세그먼트(REQUEST AND RESPONSE 선택, 오른쪽은 FIRE AND FORGET), ⑤ ARGUMENTS 아코디언의 + 버튼(툴팁 Add Argument). 행 머리글은 Calculation () → ErrorCode R&R 이고, ARGUMENTS 는 Add an argument, POSSIBLE AP ERRORS 는 Define an Error Domain first 이다.

상세에는 NAME 과 METHOD TYPE 아래에 아코디언 ARGUMENTS 와 POSSIBLE AP ERRORS, 그리고 DESCRIPTION 이 있다. ACCESS 배지 R&R 은 REQUEST AND RESPONSE 를 뜻하며 툴팁은 Request and Response 이다. POSSIBLE AP ERRORS 는 Error Domain 이 있어야 쓸 수 있고 이 장에서는 쓰지 않는다.

첫 인자 front 추가하기​

인자 다섯 개 가운데 첫 번째 front 를 절차로 보인다. 이름을 넣고 타입을 고르는 순서이며, DIRECTION 은 기본값 IN 을 그대로 둔다.

  1. ARGUMENTS 아코디언 오른쪽 끝의 + 버튼(툴팁 Add Argument)을 클릭한다. 열 머리글 #, DIRECTION, TYPE, NAME, DESCRIPTION 아래에 새 행 1 이 생긴다. DIRECTION 은 IN, TYPE 은 uint8, NAME 은 argument_0 이다.
  2. 행의 NAME 칸의 값을 front 로 바꾸고 Enter 키를 누른다.
  3. 행의 TYPE 칸 오른쪽 끝의 ⌄ 를 클릭한다. 이벤트 때와 같은 13개 항목의 드롭다운이 열린다. float32 를 클릭한다. 오른쪽 패널의 DATA TYPE 이 float32 로 바뀐다.
  4. 행이 1 IN float32 front 가 된 것을 확인한다.

나머지 인자 추가하기​

같은 방법으로 "시작하기 전에" 의 표대로 rear, left, right, result 를 추가한다. + 버튼을 누를 때마다 표 맨 아래에 새 행 argument_0(IN, uint8)이 생기므로, 행마다 NAME 을 입력하고 Enter 키를 누른 뒤 TYPE 에서 float32 를 고른다. 다섯 번째 행 result 만 DIRECTION 을 바꾼다.

  1. 2~4행 rear, left, right 를 추가한다. DIRECTION 은 IN 그대로이다.

  2. + 버튼을 한 번 더 클릭해 5행을 만든다.

  3. 5행의 DIRECTION 칸 오른쪽 끝의 ⌄ 를 클릭한다. 칸이 검색 칸(안내 Type)으로 바뀌고 드롭다운에 IN ✓, OUT, INOUT 이 보인다.

  4. 드롭다운에서 OUT 을 클릭한다.

    5행의 DIRECTION 드롭다운을 연 ARGUMENTS 표

    그림 5-7. DIRECTION 드롭다운을 연 ARGUMENTS 표. ① 1~4행 IN float32 front, rear, left, right 와 5행, ② 5행의 DIRECTION 칸(검색 상태라 안내 Type 이 보임), ③ 드롭다운에서 클릭할 OUT 행. 5행의 TYPE 과 NAME 은 아직 uint8, argument_0 이다.

  5. 5행의 NAME 칸의 값을 result 로 바꾸고 Enter 키를 누른다.

  6. 5행의 TYPE 에서 float32 를 고른다. 행이 5 OUT float32 result 가 된다.

  7. 메서드 행 머리글의 ARGS 를 본다. (float32 front, float32 rear, float32 left, float32 right) → CalculationOutput 으로 바뀌어 있다. 폭이 모자라면 … 로 줄여 보이고, 전체 문자열은 마우스를 올리면 툴팁으로 보인다.

참고. DIRECTION 드롭다운을 열면 칸의 글자가 안내 Type 으로 바뀌는데, 값이 지워진 것이 아니다. 항목을 고르거나 드롭다운을 닫으면 값이 돌아온다. ARGS 의 CalculationOutput 은 OUT 인자를 묶어 보여 주는 표시일 뿐 모델에 그런 요소가 생기는 것은 아니다.

저장하기​

  1. 탭 바의 빈 곳을 클릭해 입력 칸에서 빠져나온다. 마지막으로 입력한 값이 확정된다.

  2. Ctrl+S 를 누른다. 탭 AADesign:Interface 의 수정됨 표시 ● 가 사라지고 design/INTERFACE.io.model 이 새로 만들어진다.

  3. 편집기를 본다. 목록 선택 Sensor 와 펼쳐 둔 메서드 행은 저장 뒤에도 그대로이다.

    저장한 뒤의 편집기. 메서드 Calculation 과 인자 다섯 개가 보인다

    그림 5-8. 저장한 뒤의 편집기. ① METHODS 표의 행 머리글 Calculation (float32 front, float32 rear, float32 left, float… R&R, ② ARGUMENTS 표의 다섯 행 1 IN float32 front, 2 IN float32 rear, 3 IN float32 left, 4 IN float32 right, 5 OUT float32 result. 탭 AADesign:Interface 에 수정됨 표시 ● 가 없다. 오른쪽 DATA TYPE 패널은 마지막에 고른 float32(PRIMITIVE, MIN -3.4028235e+38, MAX 3.4028235e+38, DESCRIPTION IEEE 754 single-precision floating-point (32-bit), PREVIEW FLOAT 32 bit)를 보인다.

EDITOR 뷰는 바뀌지 않는다. DESIGN 의 Interface 행은 파일이 있든 없든 항상 보인다. 프로젝트의 파일을 보여 주는 Explorer 에는 design 폴더에 INTERFACE.io.model 이 새로 보인다. 저장된 design/INTERFACE.io.model 의 내용은 다음과 같다(날짜 필드와 빈 컬렉션은 줄였다).

{
"$schema": "https://autosar.io/schemas/interface.schema.json",
"version": "2.0.0",
"metadata": { "name": "Interface Dictionary" },
"sender-receivers": [],
"client-servers": [],
"service-interfaces": [
{
"name": "Sensor",
"major-version": 1,
"minor-version": 0,
"cpp-namespace": "sensor::service",
"events": [ { "name": "SensorData", "type": "ByteArray" } ],
"methods": [
{
"name": "Calculation",
"fire-and-forget": false,
"arguments": [
{ "name": "front", "type": "float32", "direction": "in" },
{ "name": "rear", "type": "float32", "direction": "in" },
{ "name": "left", "type": "float32", "direction": "in" },
{ "name": "right", "type": "float32", "direction": "in" },
{ "name": "result", "type": "float32", "direction": "out" }
]
}
],
"fields": []
}
],
"mode-switches": []
}

service-interfaces 에는 Sensor 하나뿐이다. REQUEST AND RESPONSE 는 "fire-and-forget": false 로, 빈 DESCRIPTION 은 키 없이 저장된다. sender-receivers 같은 다른 컬렉션은 비어 있어도 [] 로 함께 쓰인다. SERVICE.io.model 은 이 장에서 생기지 않고 SOME/IP 배포와 서비스 인스턴스에서 처음 만들어진다.

검증 결과 보기​

  1. 화면 아래 푸터의 왼쪽에서 다섯 번째 아이콘인 V 를 본다. 배지가 붙어 있지 않다.

  2. VALIDATION 패널을 본다. 닫혀 있으면 푸터의 V 아이콘을 클릭한다.

    No validation issues. 가 보이는 Validation 패널

    그림 5-9. 서비스 인터페이스를 저장한 뒤의 VALIDATION 패널. 헤더에 배지가 없고, 열 머리글 ELEMENT TYPE, NAME, DESCRIPTION, CONSTR 아래에 No validation issues. 한 줄만 있다.

이벤트와 인자의 타입이 모두 DataType 편집기에 있는 타입을 가리키므로 끊어진 참조가 없다. Interface 편집기에는 DataType 편집기 같은 자체 VALIDATION 영역이 없다. 이벤트나 인자의 TYPE 을 × 로 지우면 칸이 빨갛게 바뀌며 Type is required 가 나오고(ARGUMENTS 표에서는 칸의 툴팁으로), V 아이콘에 빨간 배지 1 이 붙으며, 다시 타입을 고를 때까지 이 패널에 "SensorData" of "Sensor": Type is required. 같은 오류가 나온다. DIRECTION 을 비우면 칸이 빨갛게 바뀌고 툴팁 Direction is required 가 나오지만, 이 패널에는 행이 생기지 않는다.

왜 이렇게 설계하는가​

  • 서비스 인터페이스는 Sensor 하나뿐이다. 참조 설계의 Interface 파일에는 SERVICE-INTERFACE Sensor 하나만 있고, 이벤트 SensorData 와 메서드 Calculation 을 가지며 필드는 없다. 이 장의 입력을 그대로 따르면 ARXML 익스포트의 Interface 파일이 참조 설계와 바이트 단위로 같아진다.
  • C++ 네임스페이스 sensor::service 는 익스포트의 NAMESPACES 가 된다. sensor 와 service 두 개의 SYMBOL-PROPS 로 나뉘어 나온다. 비워 두면 익스포트에 네임스페이스가 나오지 않는다.
  • 버전 1 / 0 은 기본값이 곧 참조 설계 값이다. 참조 설계의 MAJOR-VERSION 은 1, MINOR-VERSION 은 0 이라 손대지 않는다.
  • 이벤트 SensorData 의 타입은 ByteArray 이다. 참조 설계의 VARIABLE-DATA-PROTOTYPE SensorData 가 /DataTypes/CppImplementationDataTypes/ByteArray 를 가리킨다. 드롭다운에는 DataType 편집기에 있는 타입만 나오므로 데이터 타입이 이 장보다 앞에 온다.
  • 메서드 Calculation 은 REQUEST AND RESPONSE 이다. 참조 설계의 CLIENT-SERVER-OPERATION Calculation 은 FIRE-AND-FORGET 이 false 이다. 편집기의 기본값이 이미 그 값이므로 METHOD TYPE 을 바꾸지 않는다.
  • 인자 다섯 개는 UI 에서 float32 를 고른다. 참조 설계의 ARGUMENT-DATA-PROTOTYPE front, rear, left, right 는 IN, result 는 OUT 이고 타입은 모두 /DataTypes/CppImplementationDataTypes/float 이다. 편집기의 프리미티브 float32 가 ARXML 익스포트에서 C++ 이름 float 로 바뀌어 나온다. 인자 순서도 표와 같아야 한다.
  • SOME/IP 배포는 이 장에서 만들지 않는다. 오른쪽 SOA DEPLOYMENT 패널은 No deployments configured 그대로 두고, SOME/IP 배포와 서비스 인스턴스에서 채운다.

확인하기​

  • 탭 AADesign:Interface 의 SERVICE 탭이 활성이고 INTERFACES 목록에 Sensor 하나가 있다.
  • Sensor 를 선택하면 NAME Sensor, C++ NAMESPACE sensor::service, MAJOR VERSION 1, MINOR VERSION 0 이고 DESCRIPTION 은 빈 칸이다.
  • EVENTS 표에 행 SensorData ByteArray 하나가 있다.
  • METHODS 표에 행 Calculation 하나가 있고, ARGS 는 (float32 front, float32 rear, float32 left, float32 right) → CalculationOutput, ACCESS 는 R&R 이다.
  • Calculation 의 ARGUMENTS 표가 1 IN float32 front, 2 IN float32 rear, 3 IN float32 left, 4 IN float32 right, 5 OUT float32 result 다섯 행이다.
  • FIELDS 서브탭은 비어 있다.
  • 탭 AADesign:Interface 에 수정됨 표시 ● 가 없고 design/INTERFACE.io.model 파일이 있다.
  • VALIDATION 패널에 No validation issues. 가 보이고 헤더에 배지가 없다.

다음 단계​

SOME/IP 배포와 서비스 인스턴스에서 오른쪽 SOA DEPLOYMENT 패널로 인터페이스 Sensor 에 SOME/IP 배포(서비스 ID 11)와 서비스 인스턴스를 만든다.