데이터 타입
이 장에서 할 일
이 장에서는 토폴로지 — Ethernet 커넥터와 엔드포인트를 마친 프로젝트 AADesign 에 데이터 타입 두 개를 만든다.
DataType 편집기를 열어 PAIO 가 기본으로 제공하는 내장 타입 13개(프리미티브 11개와 포인터 타입 2개)를 확인한 뒤, + 버튼으로 ByteArray(카테고리 DYNAMIC_ARRAY, 요소 타입 uint8, 최대 크기 1, C++ 네임스페이스 aa::type)와 String(카테고리 STRING, 최대 크기 256, C++ 네임스페이스 aa::type)을 추가하고 저장한다.
이 장을 마치면 design/DATATYPE.io.model 파일이 새로 생기고 그 안에 ByteArray 와 String 두 개가 저장된다. 내장 타입 13개는 파일에 저장되지 않는다. VALIDATION 패널은 이 장의 처음과 끝에 No validation issues. 이고, 그 사이 ByteArray 의 ELEMENT TYPE 이나 String 의 MAX SIZE 가 비어 있는 동안에는 결과가 1건 보인다. 뒤의 서비스 인터페이스에서 이벤트 SensorData 의 타입으로 ByteArray 를 고른다.
시작하기 전에
- 토폴로지 — Ethernet 커넥터와 엔드포인트를 마친 상태에서 시작한다. 창 제목이
PAIO [AADesign]이고, 프로젝트의design/폴더에는IVC.io.model,SYSTEM.io.model,VFB.io.model과Module/,SWC/가 있으며DATATYPE.io.model은 아직 없다. VALIDATION 패널은No validation issues.이다. - 3장에서 열어 둔
AADesign:System탭은 닫아도 된다. 이 장은 EDITOR 뷰의 DESIGN 에서 DataType 을 열어 시작한다.
이 장에서 키보드로 입력하는 값은 다음과 같다. DESCRIPTION 은 두 타입 모두 비워 둔다.
| 타입 | CATEGORY | ELEMENT TYPE | MAX SIZE | C++ NAMESPACE |
|---|---|---|---|---|
ByteArray | DYNAMIC_ARRAY 클릭 | 목록에서 uint8 선택 | 1 | aa::type |
String | STRING 클릭 | (칸 없음) | 256 | aa::type |
참고. CONFIGURATION 패널의 입력란은 칸에서 빠져나와야 값이 확정된다. 이 장에서는 값을 입력한 뒤
Tab키를 눌러 확정한다. CATEGORY 토글과 ELEMENT TYPE 드롭다운의 선택은 클릭 즉시 확정된다.
DataType 편집기 열기
편집기 열고 내장 프리미티브 확인하기
-
왼쪽 EDITOR 뷰의 DESIGN 아래에서 DataType 을 클릭한다. 탭
AADesign:DataType이 열리고, 상단에 DATA TYPE / UNIT / FUNCTION SIGNATURE / COMPU METHOD 네 탭이 보이며 DATA TYPE 탭이 활성이다. -
왼쪽 DATATYPE 목록을 본다. 기울임체로 표시된 항목 13개가 있다.
boolean,float32,float64,sint8,sint16,sint32,sint64,uint8,uint16,uint32,uint64는 각 행 오른쪽에 배지[PRIMITIVE]가 붙어 있고, 그 아래의VoidPtr,ConstVoidPtr두 개에는 배지[POINTER]가 붙어 있다. 편집기를 열면boolean이 선택돼 있다. -
목록에서
uint8을 클릭한다. 가운데 CONFIGURATION 패널에 NAMEuint8, CATEGORY 토글에서 PRIMITIVE 가 선택된 상태(회색), MIN0, MAX255, DESCRIPTIONUnsigned 8-bit integer (0 to 255)가 보인다. 네 칸 모두 읽기 전용이라 고칠 수 없다.
그림 4-1. 처음 연 DataType 편집기. ① EDITOR 뷰 DESIGN 의 DataType 행, ② 내장 타입 13개가 있는 DATATYPE 목록(
uint8선택), ③ 목록 머리글의 + 버튼(툴팁Add DataType). 오른쪽 위 PREVIEW 에는uint8과 배지UNSIGNED INTEGER,8 bit, 범위 슬라이더0~255가, 오른쪽 아래 VALIDATION 에는No validation issues가 보인다.
편집기는 세 영역으로 나뉜다. 왼쪽 DATATYPE 목록에는 머리글 오른쪽에 +(Add DataType), −(Delete selected DataType), ⋯(More actions) 버튼과 검색 칸(안내 search...)이 있다. 가운데는 CONFIGURATION, 오른쪽은 위가 PREVIEW, 아래가 VALIDATION 이다. 이 장에서는 + 버튼과 CONFIGURATION 패널만 쓴다. UNIT, FUNCTION SIGNATURE, COMPU METHOD 탭, −, ⋯, 검색 칸은 쓰지 않는다.
참고. 프리미티브 11개는 PAIO 가 메모리에만 두는 내장 타입이다.
DATATYPE.io.model에 저장되지 않으며, ARXML 익스포트에서 익스포터가 항상 다시 넣어 준다.VoidPtr,ConstVoidPtr는 플랫폼 포인터 타입 두 개로, 프리미티브처럼 내장 타입이며 메모리에만 있고 파일에 저장되지 않으며, 익스포터가 다시 넣어 준다. 13개 모두 이름을 바꾸거나 지울 수 없고, 독자가 만드는 것은 아래의ByteArray와String두 개뿐이다.
ByteArray 만들기 — DYNAMIC_ARRAY
첫 번째 타입 ByteArray 를 절차로 보인다. 이름을 먼저 넣고 카테고리를 고른 뒤 나머지 칸을 채우는 순서이다. C++ NAMESPACE, ELEMENT TYPE, MAX SIZE 칸은 카테고리를 고르기 전에는 보이지 않는다.
항목 추가하기
-
DATATYPE 목록 머리글의 + 버튼을 클릭한다. 목록 맨 아래에 새 항목
DataType13이 생기고 바로 선택된다. 배지는 아직 없다. -
CONFIGURATION 패널을 본다. NAME 은
DataType13, CATEGORY 토글은 아무것도 선택돼 있지 않고 그 아래에 빨간 안내Category is required가 보인다. DESCRIPTION 은 빈 칸이다.
그림 4-2. 새 항목을 추가한 직후의 편집기. ① 목록 맨 아래의
DataType13행, ② NAME =DataType13, ③ 아무것도 선택되지 않은 CATEGORY 토글과 그 아래의 빨간Category is required. VALIDATION 에는1 error와[13] "DataType13": Category is not set이 보이고, 그림 밖의 탭AADesign:DataType에는 수정됨 표시 ● 가 붙어 있다. PREVIEW 는 아직 직전에 보던uint8을 보인다.
새 항목의 이름은 DataType 뒤에 그때의 목록 길이가 붙은 DataType13 처럼 자동으로 정해진다. CATEGORY 토글은 PRIMITIVE, ALIAS, ENUMERATION, FIXED_ARRAY, DYNAMIC_ARRAY, STRING, STRUCTURE, MAP, UNION, POINTER, FUNCTION_POINTER 열한 칸이며 PRIMITIVE 는 내장 타입 전용이라 회색이고 클릭할 수 없다. VALIDATION 영역의 [13] 은 목록에서의 순번이다. PREVIEW 는 카테고리를 고른 뒤에 새 항목의 내용으로 바뀐다.
이름 입력하고 카테고리 고르기
-
NAME 입력란의 값을
ByteArray로 바꾸고Tab키를 누른다. 목록의 행도ByteArray로 바뀐다. -
CATEGORY 토글에서 DYNAMIC_ARRAY 를 클릭한다. 패널이 다시 그려져 NAME 오른쪽에 C++ NAMESPACE 칸이, CATEGORY 아래에 ELEMENT TYPE 과 MAX SIZE 칸이 나타난다. VALIDATION 은
1 error와[13] "ByteArray": Element Type is required로 바뀐다. 동시에 푸터의 V 아이콘에 빨간 배지1이 붙는다. 요소 타입을 고를 때까지 프로젝트 검증이 오류constr_1907(DYNAMIC_ARRAY datatype "ByteArray" has no element type.)을 보고하기 때문이다. -
ELEMENT TYPE 칸을 클릭한다. 칸에 안내
Type to search...가 보이고 내장 타입 13개가 든 드롭다운이 열린다. 한 번에 여섯 행쯤 보이므로 스크롤해uint8을 찾는다. -
드롭다운에서
uint8을 클릭한다.
그림 4-3. ELEMENT TYPE 드롭다운을 연 CONFIGURATION 패널. ① CATEGORY 에서 선택한 DYNAMIC_ARRAY, ② ELEMENT TYPE 칸(안내
Type to search...), ③ 드롭다운에서 클릭할uint8행. 드롭다운에는sint32,sint64,uint8,uint16,uint32행이 보이고 오른쪽에 스크롤바가 있다. NAME 은ByteArray, C++ NAMESPACE 와 MAX SIZE 는 아직 빈 칸(안내C++ Namespace (e.g., paio::api),Unsigned Integer (0..4294967295))이다.
드롭다운에는 이 프로젝트의 다른 타입이 모두 나온다. 지금은 내장 타입 13개뿐이고 String 은 아직 만들지 않았으므로 없다. uint8 을 고르면 칸에 uint8 과 지우기용 ×, 펼치기용 ⌄ 가 보이고, VALIDATION 은 No validation issues 로 돌아가며 V 아이콘의 배지도 사라진다.
최대 크기와 네임스페이스 입력하기
-
MAX SIZE 입력란(안내
Unsigned Integer (0..4294967295))에1을 입력하고Tab키를 누른다. -
C++ NAMESPACE 입력란(안내
C++ Namespace (e.g., paio::api))에aa::type을 입력하고Tab키를 누른다.
그림 4-4.
ByteArray를 완성한 편집기. ① 목록의ByteArray [DYNAMIC_ARRAY]행, ② NAME =ByteArray, ③ CATEGORY = DYNAMIC_ARRAY, ④ ELEMENT TYPE =uint8, ⑤ MAX SIZE =1, ⑥ C++ NAMESPACE =aa::type. PREVIEW 에는ByteArray, 파란 글씨uint8[..1] (Dynamic), 점선 상자[0] uint8하나, 빗금 바0..1 elements | max 1 bytes가 보이고 VALIDATION 은No validation issues이다. 탭에는 수정됨 표시 ● 가 붙어 있다.
DESCRIPTION 은 빈 칸(안내 Text) 그대로 둔다. 목록 행의 배지가 [DYNAMIC_ARRAY] 로 바뀐 것을 확인한다.
String 만들기 — STRING
같은 방법으로 두 번째 타입 String 을 만든다. 카테고리가 STRING 이면 ELEMENT TYPE 칸이 없고 MAX SIZE 가 한 줄 전체를 차지한다. 값은 "시작하기 전에" 의 표와 같다.
-
DATATYPE 목록 머리글의 + 버튼을 클릭한다. 목록 맨 아래에 새 항목
DataType14가 생기고 선택된다. -
NAME 입력란의 값을
String으로 바꾸고Tab키를 누른다. -
CATEGORY 토글에서 STRING 을 클릭한다. 칸이 NAME, C++ NAMESPACE, CATEGORY, MAX SIZE, DESCRIPTION 으로 바뀌고, VALIDATION 에
1 warning과[14] "String": Max Size not set, default 255 will be applied가 보인다. 푸터의 V 아이콘에는 같은 내용의 프로젝트 검증 경고constr_1093(STRING datatype "String" has no maximum size (swMaxTextSize).) 때문에 주황 배지1이 붙는다. -
MAX SIZE 입력란에
256을 입력하고Tab키를 누른다. VALIDATION 이No validation issues로 돌아가고 V 아이콘의 배지도 사라진다. -
C++ NAMESPACE 입력란에
aa::type을 입력하고Tab키를 누른다.
그림 4-5.
String을 완성한 편집기. ① NAME =String, ② CATEGORY = STRING, ③ MAX SIZE =256, ④ C++ NAMESPACE =aa::type, ⑤ 목록의String [STRING]행. 그 위에ByteArray [DYNAMIC_ARRAY]행이 있다. PREVIEW 에는String과 문자 칸_10개,...+246이 보이고 VALIDATION 은No validation issues이다.
주의. MAX SIZE 를 비워 두면 경고(편집기의 경고와 VALIDATION 패널의
constr_1093)만 나고 저장은 된다. 그러나 그 경우 기본값255가 적용되어 참조 설계와 달라지므로 반드시256을 넣는다.
저장하기
-
DATATYPE 목록에서 마지막 행 아래의 빈 곳을 클릭해 입력 칸에서 빠져나온다. 마지막으로 입력한 값이 확정되고
String은 선택된 채로 남는다. -
Ctrl+S를 누른다. 탭AADesign:DataType의 수정됨 표시 ● 가 사라지고design/DATATYPE.io.model이 새로 만들어진다. -
목록을 본다. 내장 타입 13개 아래에
ByteArray [DYNAMIC_ARRAY]와String [STRING]이 있어 모두 15개이다. 저장한 뒤에도String이 선택돼 있다.ByteArray를 클릭해 값이 그대로 남아 있는지 확인한다.
그림 4-6. 저장한 뒤
ByteArray를 다시 클릭한 편집기. ①ByteArray [DYNAMIC_ARRAY]행, ②String [STRING]행. 탭AADesign:DataType에 수정됨 표시 ● 가 없고, CONFIGURATION 과 PREVIEW 는 그림 4-4 와 같다.
EDITOR 뷰는 바뀌지 않는다. DESIGN 의 DataType 행은 파일이 있든 없든 항상 보이므로 파일이 생긴 것은 이 뷰로는 알 수 없다. 저장된 design/DATATYPE.io.model 의 내용은 다음과 같다(날짜 필드는 생략).
{
"$schema": "https://autosar.io/schemas/datatype.schema.json",
"version": "2.0.0",
"type": "PAIO-datatype",
"metadata": {},
"data-types": {
"data-type": [
{ "short-name": "ByteArray", "category": "DYNAMIC_ARRAY", "type-reference-ref": "uint8", "array-size": 1, "name-space": "aa::type" },
{ "short-name": "String", "category": "STRING", "max-size": 256, "name-space": "aa::type" }
],
"units": []
}
}
data-type 에는 두 항목뿐이고 내장 타입 13개는 없다. 빈 DESCRIPTION 은 키 자체가 쓰이지 않는다.
검증 결과 보기
-
화면 아래 푸터의 왼쪽에서 다섯 번째 아이콘인 V 를 본다. 배지는 없지만 툴팁에는 0이 아니던 마지막 건수
Validation: 0 error(s), 1 warning(s), 0 info(s)가 그대로 남아 있다. 현재 결과는 VALIDATION 패널에서 확인한다. -
VALIDATION 패널을 본다. 닫혀 있으면 푸터의 V 아이콘을 클릭한다.
그림 4-7. 데이터 타입을 저장한 뒤의 VALIDATION 패널. 헤더에 배지가 없고, 열 머리글 ELEMENT TYPE, NAME, DESCRIPTION, CONSTR 아래에
No validation issues.한 줄만 있다.
3장을 마쳤을 때처럼 프로젝트 검증 결과는 0건이다. 편집기 오른쪽 아래의 VALIDATION 영역은 DataType 편집기가 자체로 하는 검사이고, 이 패널은 프로젝트 전체 검증이라 서로 다른 것이다. 프로젝트 검증은 저장하기 전에도 편집할 때마다 다시 돌기 때문에, ByteArray 의 ELEMENT TYPE 과 String 의 MAX SIZE 가 비어 있던 동안 constr_1907 과 constr_1093 이 나타났다.
왜 이렇게 설계하는가
ByteArray는uint8의 가변 길이 배열이고 서비스 인터페이스보다 먼저 만든다. 참조 설계의ByteArray는 네임스페이스aa::type에 있는uint8_t의VECTOR(ARRAY-SIZE1)이고, 서비스 인터페이스Sensor의 이벤트SensorData가 이 타입을 쓴다. Interface 편집기의 타입 드롭다운에는 DataType 편집기에 있는 타입만 나오므로 이 장이 5장보다 앞에 온다. 편집기의uint8은 ARXML 익스포트에서 C++ 이름uint8_t로 바뀌어 나온다.- 프리미티브 11개는 입력하지 않는다. 참조 설계의
STD-CPP-IMPLEMENTATION-DATA-TYPE13개 가운데 11개(bool,float,double,int8_t…uint64_t)가 편집기의 내장 프리미티브boolean,float32,float64,sint8…uint64에 해당한다. 이름, 설명,TYPE-EMITTER/HEADER-FILE은 익스포터가 정하는 규칙이지 입력 대상이 아니다.SW-BASE-TYPE,IMPLEMENTATION-DATA-TYPE,APPLICATION-*-DATA-TYPE,DATA-TYPE-MAPPING-SET같은 CP 측 요소도 익스포터가 자동으로 만든다. String은 어떤 인터페이스도 쓰지 않지만 만든다. 참조 설계의 13개 타입을 그대로 맞추기 위해서이다. 만들지 않으면 익스포트의 C++ 구현 타입이 12개가 된다.String의MAX SIZE는256이다. 참조 설계의String에는ARRAY-SIZE가 없지만, 비워 두면 기본값255가 적용된다.256은 참조 설계 CP 측 미러의 문자열 크기와 같은 값이다. 그 대신 독자의 익스포트에는STD-CPP-IMPLEMENTATION-DATA-TYPE String에ARRAY-SIZE 256이,APPLICATION-PRIMITIVE-DATA-TYPE String에SW-TEXT-PROPS가 참조 설계보다 더 나온다. 이것은 정상 차이이며 ARXML 익스포트에서 다시 설명한다.STD-CPP-IMPLEMENTATION-DATA-TYPEByteArray는 참조 설계와 같다. 두 타입의IMPLEMENTATION-DATA-TYPE과APPLICATION-ARRAY-DATA-TYPEByteArray는 크기1,256은 같지만 PAIO 의 가변 크기 배열 형태로 나오며, 이것도 그 장에서 설명한다.- C++ 네임스페이스
aa::type은 두 타입 모두에 넣는다. 이 값이 익스포트의NAMESPACES(aa,type두 개의SYMBOL-PROPS)가 된다. 비워 두면 익스포트에 네임스페이스가 나오지 않는다.
확인하기
- 탭
AADesign:DataType의 DATATYPE 목록에 항목 15개가 있다. 기울임체[PRIMITIVE]11개와[POINTER]2개 아래에ByteArray [DYNAMIC_ARRAY],String [STRING]이 있다. -
ByteArray를 클릭하면 NAMEByteArray, C++ NAMESPACEaa::type, CATEGORY DYNAMIC_ARRAY, ELEMENT TYPEuint8, MAX SIZE1이고 PREVIEW 에uint8[..1] (Dynamic)이 보인다. -
String을 클릭하면 NAMEString, C++ NAMESPACEaa::type, CATEGORY STRING, MAX SIZE256이고 ELEMENT TYPE 칸이 없다. - 두 타입 모두 DESCRIPTION 이 빈 칸이고 편집기의 VALIDATION 영역이
No validation issues이다. - 탭
AADesign:DataType에 수정됨 표시 ● 가 없고design/DATATYPE.io.model파일이 있다. - VALIDATION 패널에
No validation issues.가 보이고 헤더에 배지가 없다.
다음 단계
서비스 인터페이스에서 Interface 편집기로 서비스 인터페이스 Sensor 를 만들고, 이벤트 SensorData 의 타입으로 이 장에서 만든 ByteArray 를 고른다.