כתיבת הגדרה של סוג SOME/IP

כשמגדירים מיפויים של תוכנת ביניים מבוססת-שירות וניתנת להרחבה על גבי IP ‏(SOME/IP) ב-VSIDL, מתארים את המבנה של מטען הייעודי (payload) של SOME/IP. אתם מתארים את המבנה באמצעות ההודעה SomeIpType, שמאפשרת לכם ליצור מודלים של פרימיטיבים, מחרוזות, מערכים ומבנים מורכבים.

בדף הזה נסביר איך לכתוב הגדרת סוג SomeIpStruct, שמשמשת בבלוקים type_definition למיפוי אירועים ושיטות.

הודעה מסוג SomeIpStruct

הודעת SomeIpStruct מייצגת מטען ייעודי (payload) מובנה של SOME/IP שמורכב מכמה שדות. המבנה שמוגדר כאן משמש את מתווך SOME/IP כדי לתרגם בין בייטים גולמיים של SOME/IP לבין השדות של הודעת SDV protobuf.

כשמגדירים struct, קובעים שני מאפיינים עיקריים:

  • length_field_size (אופציונלי): מציין את הגודל (בבייטים) של שדה האורך שקודם למבנה ב-payload שעבר סריאליזציה. הערכים שבהם נעשה שימוש מתוך enum‏ LengthFieldSize כוללים את ZERO (ללא שדה אורך), ONE,‏ TWO ו-FOUR.
  • field (repeated): רשימה של שדות שמרכיבים את המבנה.

הגדרת שדות של מבנה

כל שדה בתוך SomeIpStruct צריך לכלול:

  • field_name: שם השדה. השם הזה חייב להיות זהה לשם השדה התואם שהוגדר בהודעת ה-protobuf של SDV, כדי להבטיח תרגום נכון של ההודעה.
  • field_type: סוג הנתונים של השדה (SomeIpType) ב-SOME/IP. יכול להיות שזהו סוג נתונים פרימיטיבי, מחרוזת, מערך או מבנה מקונן אחר.

כתיבה של סוגי השדות SomeIpType

הבלוק field_type מגדיר את סוג הנתונים הספציפי באמצעות אחת מהאפשרויות הבאות:

  • סוגים פרימיטיביים: משתמשים ב-someip_primitive עם ערכים כמו UINT8, ‏ UINT32, ‏ INT32, ‏ FLOAT32 ו-BOOL.
  • מחרוזות: משתמשים ב-someip_string ומציינים את הקידוד (לדוגמה, UTF_8, ‏ UTF_16_LE) ואת פרטי האורך (fixed_length או length_field_size).
  • מערכים: משתמשים ב-someip_array ומגדירים את array_type (שהוא עוד SomeIpType רקורסיבי), יחד עם מידע על האורך (fixed_length או length_field_size).
  • מבני נתונים מוטמעים: אפשר להשתמש ב-someip_struct כדי להטמיע הגדרה אחרת של מבנה נתונים באופן רקורסיבי.

דוגמה: כתיבת הגדרה של סוג struct

הנה דוגמה מעשית לאופן הכתיבה של SomeIpStruct בתוך בלוק type_definition. המטען הייעודי (payload) הזה מכיל מספר שלם לא מסומן בן 8 ביט בשם interval ומספר שלם לא מסומן בן 32 ביט בשם counter:

type_definition {
  # No length field precedes this struct
  length_field_size: ZERO

  # First field: interval
  field {
    field_name: "interval"
    field_type {
      someip_primitive: UINT8
    }
  }

  # Second field: counter
  field {
    field_name: "counter"
    field_type {
      someip_primitive: UINT32
    }
  }
}

הוספת סוגים מורכבים

כדי לכלול שדה מחרוזת באורך דינמי ומערך בתוך המבנה, מוסיפים שדות כמו אלה:

field {
  field_name: "status_message"
  field_type {
    someip_string {
      string_encoding: UTF_8
      length_field_size: FOUR
    }
  }
}
field {
  field_name: "measurements"
  field_type {
    someip_array {
      length_field_size: FOUR
      array_type { someip_primitive: FLOAT32 }
    }
  }
}