서비스 인터페이스
이 장에서 할 일
이 장에서는 데이터 타입을 마친 프로젝트 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 | 그 밖의 값 |
|---|---|---|
| 서비스 인터페이스 | Sensor | C++ NAMESPACE sensor::service, MAJOR VERSION 1, MINOR VERSION 0 (기본값) |
| 이벤트 | SensorData | TYPE 드롭다운에서 ByteArray 선택 |
| 메서드 | Calculation | METHOD TYPE REQUEST AND RESPONSE (기본값) |
메서드 Calculation 의 인자 다섯 개는 다음 순서로 만든다.
| # | DIRECTION | TYPE | NAME |
|---|---|---|---|
| 1 | IN (기본값) | float32 | front |
| 2 | IN (기본값) | float32 | rear |
| 3 | IN (기본값) | float32 | left |
| 4 | IN (기본값) | float32 | right |
| 5 | OUT (드롭다운에서 선택) | float32 | result |
참고. NAME 입력란은
Enter키를 누르거나 칸에서 빠져나와야 값이 확정된다. 이 장에서는 이름을 입력한 뒤Enter키를, C++ NAMESPACE 는 입력한 뒤Tab키를 누른다. 드롭다운과 METHOD TYPE 세그먼트의 선택은 클릭 즉시 확정된다.
Interface 편집기 열기
편집기 열고 SERVICE 탭 확인하기
-
왼쪽 EDITOR 뷰의 DESIGN 아래에서 Interface 를 클릭한다. 탭
AADesign:Interface가 열린다. -
편집기 위쪽의 카테고리 탭 일곱 개 SERVICE, SENDER-RECEIVER, CLIENT-SERVER, MODE-SWITCH, ADAPTIVE, ERROR DOMAIN, MAPPING 을 본다. 열자마자 SERVICE 탭이 활성이다. 이 장은 SERVICE 탭만 쓴다.
-
세 패널을 본다. 왼쪽 INTERFACES 목록은 비어 있어
Add an interface가, 가운데 CONFIGURATION 은Select an interface가, 오른쪽 SOA DEPLOYMENT 서브탭은Select a service interface가 보인다.
그림 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 만들기
인터페이스 추가하기
-
INTERFACES 머리글의 + 버튼을 클릭한다. 목록에 새 항목
ServiceInterface_0이 생기고 바로 선택된다. -
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가 보인다.
그림 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 배포와 서비스 인스턴스에서 채운다.
이름과 네임스페이스 입력하기
-
NAME 입력란의 값을
Sensor로 바꾸고Enter키를 누른다. 목록의 행도Sensor로 바뀐다. -
C++ NAMESPACE 입력란에
sensor::service를 입력하고Tab키를 누른다. -
MAJOR VERSION
1과 MINOR VERSION0은 그대로 둔다. 참조 설계와 같은 값이다.
그림 5-3. 기본 정보를 넣은 인터페이스
Sensor. ① NAME =Sensor, ② C++ NAMESPACE =sensor::service, ③ MAJOR VERSION =1과 MINOR VERSION =0, ④ 활성인 EVENTS 서브탭. 목록의 행은Sensor이고 DESCRIPTION 은 빈 칸이다.
이벤트 SensorData 추가하기
이벤트 추가하고 이름 입력하기
- 서브탭 EVENTS 가 활성인지 확인한다. 서브탭 줄 오른쪽 끝의 + 버튼(툴팁
Add Event)을 클릭한다. 열 머리글 NAME, TYPE, DESCRIPTION 아래에 새 행Event_0이 생기고, TYPE 은uint8이며, 행이 펼쳐져 아래에 상세 칸 NAME, TYPE, DESCRIPTION 이 보인다. - 상세의 NAME 입력란의 값을
SensorData로 바꾸고Enter키를 누른다. 행 머리글도SensorData로 바뀐다.
새 이벤트의 이름은 Event_0 처럼, 타입은 uint8 로 자동으로 정해진다. 행 머리글을 클릭하면 상세가 접히고 다시 클릭하면 펼쳐진다.
타입 ByteArray 고르기
-
상세의 TYPE 칸 오른쪽 끝의 ⌄ 를 클릭한다. 검색 칸(안내
Type to search...)과 드롭다운이 열린다. 드롭다운에는 프리미티브 11개boolean,float32,float64,sint8,sint16,sint32,sint64,uint8,uint16,uint32,uint64와 4장에서 만든ByteArray,String이 이 순서로 모두 13개 있고, 현재값uint8행에 ✓ 가 있다. 한 번에 여섯 행쯤 보이므로 스크롤해ByteArray를 찾는다. -
드롭다운에서
ByteArray를 클릭한다.
그림 5-4. TYPE 드롭다운을 연 EVENTS 표. ① 활성인 EVENTS 서브탭, ② 줄 오른쪽 끝의 + 버튼(툴팁
Add Event), ③ 상세의 NAME 칸 =SensorData, ④ 드롭다운에서 클릭할ByteArray행. 드롭다운에는uint8✓,uint16,uint32,uint64,ByteArray,String행이 보이고 오른쪽에 스크롤바가 있다. -
행 머리글이
SensorDataByteArray로 바뀐 것을 확인한다. 오른쪽 패널이 DATA TYPE 서브탭으로 저절로 바뀌어 고른 타입ByteArray의 내용을 보여 준다.
그림 5-5. 이벤트
SensorData를 완성한 편집기. ① EVENTS 표의SensorDataByteArray행과 그 상세(NAME =SensorData, TYPE =ByteArray), ② 오른쪽의 DATA TYPE 패널. 패널에는 NAMEByteArray, C++ NAMESPACEaa::type, CATEGORY 에서 선택된 DYNAMIC_ARRAY, ELEMENT TYPEuint8, MAX SIZE1이 있고, 아래 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 추가하기
메서드 추가하기
-
서브탭 METHODS 를 클릭한다. 표가 비어 있어
Add a method가 보인다. -
서브탭 줄 오른쪽 끝의 + 버튼(툴팁
Add Method)을 클릭한다. 열 머리글 NAME, ARGS, ACCESS, DESCRIPTION 아래에 새 행Method_0이 생기고, ARGS 는() → ErrorCode, ACCESS 는 배지R&R이며, 행이 펼쳐져 상세가 보인다. -
상세의 NAME 입력란의 값을
Calculation으로 바꾸고Enter키를 누른다. 행 머리글도Calculation으로 바뀐다. -
METHOD TYPE 세그먼트는 REQUEST AND RESPONSE 가 선택된 그대로 둔다.

그림 5-6. 메서드
Calculation을 추가한 직후의 METHODS 표. ① 활성인 METHODS 서브탭, ② 줄 오른쪽 끝의 + 버튼(툴팁Add Method), ③ 상세의 NAME 칸 =Calculation, ④ METHOD TYPE 세그먼트(REQUEST AND RESPONSE 선택, 오른쪽은 FIRE AND FORGET), ⑤ ARGUMENTS 아코디언의 + 버튼(툴팁Add Argument). 행 머리글은Calculation() → ErrorCodeR&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 을 그대로 둔다.
- ARGUMENTS 아코디언 오른쪽 끝의 + 버튼(툴팁
Add Argument)을 클릭한다. 열 머리글 #, DIRECTION, TYPE, NAME, DESCRIPTION 아래에 새 행1이 생긴다. DIRECTION 은IN, TYPE 은uint8, NAME 은argument_0이다. - 행의 NAME 칸의 값을
front로 바꾸고Enter키를 누른다. - 행의 TYPE 칸 오른쪽 끝의 ⌄ 를 클릭한다. 이벤트 때와 같은 13개 항목의 드롭다운이 열린다.
float32를 클릭한다. 오른쪽 패널의 DATA TYPE 이float32로 바뀐다. - 행이
1INfloat32front가 된 것을 확인한다.
나머지 인자 추가하기
같은 방법으로 "시작하기 전에" 의 표대로 rear, left, right, result 를 추가한다. + 버튼을 누를 때마다 표 맨 아래에 새 행 argument_0(IN, uint8)이 생기므로, 행마다 NAME 을 입력하고 Enter 키를 누른 뒤 TYPE 에서 float32 를 고른다. 다섯 번째 행 result 만 DIRECTION 을 바꾼다.
-
2~4행
rear,left,right를 추가한다. DIRECTION 은IN그대로이다. -
+ 버튼을 한 번 더 클릭해 5행을 만든다.
-
5행의 DIRECTION 칸 오른쪽 끝의 ⌄ 를 클릭한다. 칸이 검색 칸(안내
Type)으로 바뀌고 드롭다운에IN✓,OUT,INOUT이 보인다. -
드롭다운에서
OUT을 클릭한다.
그림 5-7. DIRECTION 드롭다운을 연 ARGUMENTS 표. ① 1~4행
INfloat32front,rear,left,right와 5행, ② 5행의 DIRECTION 칸(검색 상태라 안내Type이 보임), ③ 드롭다운에서 클릭할OUT행. 5행의 TYPE 과 NAME 은 아직uint8,argument_0이다. -
5행의 NAME 칸의 값을
result로 바꾸고Enter키를 누른다. -
5행의 TYPE 에서
float32를 고른다. 행이5OUTfloat32result가 된다. -
메서드 행 머리글의 ARGS 를 본다.
(float32 front, float32 rear, float32 left, float32 right) → CalculationOutput으로 바뀌어 있다. 폭이 모자라면…로 줄여 보이고, 전체 문자열은 마우스를 올리면 툴팁으로 보인다.
참고. DIRECTION 드롭다운을 열면 칸의 글자가 안내
Type으로 바뀌는데, 값이 지워진 것이 아니다. 항목을 고르거나 드롭다운을 닫으면 값이 돌아온다. ARGS 의CalculationOutput은 OUT 인자를 묶어 보여 주는 표시일 뿐 모델에 그런 요소가 생기는 것은 아니다.
저장하기
-
탭 바의 빈 곳을 클릭해 입력 칸에서 빠져나온다. 마지막으로 입력한 값이 확정된다.
-
Ctrl+S를 누른다. 탭AADesign:Interface의 수정됨 표시 ● 가 사라지고design/INTERFACE.io.model이 새로 만들어진다. -
편집기를 본다. 목록 선택
Sensor와 펼쳐 둔 메서드 행은 저장 뒤에도 그대로이다.
그림 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, MAX3.4028235e+38, DESCRIPTIONIEEE 754 single-precision floating-point (32-bit), PREVIEWFLOAT32 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 배포와 서비스 인스턴스에서 처음 만들어진다.
검증 결과 보기
-
화면 아래 푸터의 왼쪽에서 다섯 번째 아이콘인 V 를 본다. 배지가 붙어 있지 않다.
-
VALIDATION 패널을 본다. 닫혀 있으면 푸터의 V 아이콘을 클릭한다.
그림 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-INTERFACESensor하나만 있고, 이벤트SensorData와 메서드Calculation을 가지며 필드는 없다. 이 장의 입력을 그대로 따르면 ARXML 익스포트의 Interface 파일이 참조 설계와 바이트 단위로 같아진다. - C++ 네임스페이스
sensor::service는 익스포트의NAMESPACES가 된다.sensor와service두 개의SYMBOL-PROPS로 나뉘어 나온다. 비워 두면 익스포트에 네임스페이스가 나오지 않는다. - 버전
1/0은 기본값이 곧 참조 설계 값이다. 참조 설계의MAJOR-VERSION은1,MINOR-VERSION은0이라 손대지 않는다. - 이벤트
SensorData의 타입은ByteArray이다. 참조 설계의VARIABLE-DATA-PROTOTYPESensorData가/DataTypes/CppImplementationDataTypes/ByteArray를 가리킨다. 드롭다운에는 DataType 편집기에 있는 타입만 나오므로 데이터 타입이 이 장보다 앞에 온다. - 메서드
Calculation은REQUEST AND RESPONSE이다. 참조 설계의CLIENT-SERVER-OPERATIONCalculation은FIRE-AND-FORGET이false이다. 편집기의 기본값이 이미 그 값이므로 METHOD TYPE 을 바꾸지 않는다. - 인자 다섯 개는 UI 에서
float32를 고른다. 참조 설계의ARGUMENT-DATA-PROTOTYPEfront,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를 선택하면 NAMESensor, C++ NAMESPACEsensor::service, MAJOR VERSION1, MINOR VERSION0이고 DESCRIPTION 은 빈 칸이다. - EVENTS 표에 행
SensorDataByteArray하나가 있다. - 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)와 서비스 인스턴스를 만든다.