gsm_03_41.h
#pragma once
#include <stdint.h>
#include <osmocom/core/endian.h>
#include <osmocom/gsm/protocol/gsm_04_12.h>
#ifndef OSMO_IS_LITTLE_ENDIAN
#define OSMO_IS_LITTLE_ENDIAN 0
#endif
/* GSM TS 03.41 definitions also TS 23.041*/
#define GSM341_MAX_PAYLOAD (GSM412_MSG_LEN-sizeof(struct gsm341_ms_message))
#define GSM341_MAX_CHARS (GSM341_MAX_PAYLOAD*8/7)
#define GSM341_7BIT_PADDING '\r'
/* Chapter 9.3.2 */
struct gsm341_ms_message {
struct {
#if OSMO_IS_LITTLE_ENDIAN == 1
uint8_t code_hi:6;
uint8_t gs:2;
uint8_t update:4;
uint8_t code_lo:4;
#else
uint8_t gs:2;
uint8_t code_hi:6;
uint8_t code_lo:4;
uint8_t update:4;
#endif
} serial;
uint16_t msg_id;
struct {
#if OSMO_IS_LITTLE_ENDIAN == 1
uint8_t language:4;
uint8_t group:4;
#else
uint8_t group:4;
uint8_t language:4;
#endif
} dcs;
struct {
#if OSMO_IS_LITTLE_ENDIAN == 1
uint8_t total:4;
uint8_t current:4;
#else
uint8_t current:4;
uint8_t total:4;
#endif
} page;
uint8_t data[0];
} __attribute__((packed));
/* Chapter 9.4.1.3 */
struct gsm341_etws_message {
struct {
#if OSMO_IS_LITTLE_ENDIAN == 1
uint8_t code_hi:4;
uint8_t popup:1;
uint8_t alert:1;
uint8_t gs:2;
uint8_t update:4;
uint8_t code_lo:4;
#else
uint8_t gs:2;
uint8_t alert:1;
uint8_t popup:1;
uint8_t code_hi:4;
uint8_t code_lo:4;
uint8_t update:4;
#endif
} serial;
uint16_t msg_id;
uint16_t warning_type;
uint8_t data[0];
} __attribute__((packed));
#define GSM341_MSG_CODE(ms) ((ms)->serial.code_lo | ((ms)->serial.code_hi << 4))
/* Section 9.3.2.1 - Geographical Scope */
#define GSM341_GS_CELL_WIDE_IMMED 0
#define GSM341_GS_PLMN_WIDE 1
#define GSM341_GS_LA_WIDE 2
#define GSM341_GS_CELL_WIDE 3
/* Section 9.4.1.2.2 */
#define GSM341_MSGID_EOTD_ASSISTANCE 0x03E8
#define GSM341_MSGID_DGPS_CORRECTION 0x03E9
#define GSM341_MSGID_DGPS_EPH_CLOCK_COR 0x03EA
#define GSM341_MSGID_GPS_ALMANAC_OTHER 0x03EB
#define GSM341_MSGID_ETWS_EARTHQUAKE 0x1100
#define GSM341_MSGID_ETWS_TSUNAMI 0x1101
#define GSM341_MSGID_ETWS_QUAKE_AND_TSUNAMI 0x1102
#define GSM341_MSGID_ETWS_TEST 0x1103
#define GSM341_MSGID_ETWS_OTHER 0x1104
#define GSM341_MSGID_ETWS_CMAS_PRESIDENTIAL 0x1112
#define GSM341_MSGID_ETWS_CMAS_EXTREME_IMM_OBSERVED 0x1113
#define GSM341_MSGID_ETWS_CMAS_EXTREME_IMM_LIKELY 0x1114
#define GSM341_MSGID_ETWS_CMAS_EXTREME_EXP_OBSERVED 0x1115
#define GSM341_MSGID_ETWS_CMAS_EXTREME_EXP_LIKELY 0x1116
#define GSM341_MSGID_ETWS_CMAS_SEVERE_IMM_OBSERVED 0x1117
#define GSM341_MSGID_ETWS_CMAS_SEVERE_IMM_LIKELY 0x1118
#define GSM341_MSGID_ETWS_CMAS_SEVERE_EXP_OBSERVED 0x1119
#define GSM341_MSGID_ETWS_CMAS_SEVERE_EXP_LIKELY 0x111A
#define GSM341_MSGID_ETWS_CMAS_AMBER 0x111B
#define GSM341_MSGID_ETWS_CMAS_MONTHLY_TEST 0x111C
#define GSM341_MSGID_ETWS_CMAS_EXERCISE 0x111D
#define GSM341_MSGID_ETWS_CMAS_OPERATOR_DEFINED 0x111E
#define GSM341_MSGID_ETWS_CMAS_PRESIDENTIAL_AL 0x111F
#define GSM341_MSGID_ETWS_CMAS_EXTREME_IMM_OBSERVED_AL 0x1120
#define GSM341_MSGID_ETWS_CMAS_EXTREME_IMM_LIKELY_AL 0x1121
#define GSM341_MSGID_ETWS_CMAS_EXTREME_EXP_OBSERVED_AL 0x1122
#define GSM341_MSGID_ETWS_CMAS_EXTREME_EXP_LIKELY_AL 0x1123
#define GSM341_MSGID_ETWS_CMAS_SEVERE_IMM_OBSERVED_AL 0x1124
#define GSM341_MSGID_ETWS_CMAS_SEVERE_IMM_LIKELY_AL 0x1125
#define GSM341_MSGID_ETWS_CMAS_SEVERE_EXP_OBSERVED_AL 0x1126
#define GSM341_MSGID_ETWS_CMAS_SEVERE_EXP_LIKELY_AL 0x1127
#define GSM341_MSGID_ETWS_CMAS_AMBER_AL 0x1128
#define GSM341_MSGID_ETWS_CMAS_MONTHLY_TEST_AL 0x1129
#define GSM341_MSGID_ETWS_CMAS_EXERCISE_AL 0x112A
#define GSM341_MSGID_ETWS_CMAS_OPERATOR_DEFINED_AL 0x112B
#define GSM341_MSGID_ETWS_EU_INFO_LOCAL_LANGUAGE 0x1900
gsm341_etws_message
Definition: gsm_03_41.h:56
gsm341_ms_message
Definition: gsm_03_41.h:19