C2A_Core
vcdu.c
[詳解]
1 #pragma section REPRO
2 #include "vcdu.h"
3 
4 #include <string.h> // for memcpy
5 
6 static void VCDU_set_common_hdr_(VCDU* vcdu);
7 static void VCDU_clear_spare_(VCDU* vcdu);
8 
9 void VCDU_generate_byte_stream(const VCDU* vcdu,
10  uint8_t byte_stream[VCDU_LEN])
11 {
12  memcpy(byte_stream, vcdu->header, VCDU_HEADER_SIZE);
13  byte_stream += VCDU_HEADER_SIZE;
14 
15  M_PDU_generate_byte_stream(&(vcdu->m_pdu), byte_stream);
16  byte_stream += M_PDU_LEN;
17 
18  memcpy(byte_stream, vcdu->trailer, VCDU_TRAILER_SIZE);
19 }
20 
22 {
25  M_PDU_setup_idle_m_pdu(&(vcdu->m_pdu));
26 }
27 
29  uint32_t counter)
30 {
33  VCDU_set_vcdu_counter(vcdu, counter);
34 }
35 
37  uint32_t counter)
38 {
42  VCDU_set_vcdu_counter(vcdu, counter);
43 }
44 
45 static void VCDU_set_common_hdr_(VCDU* vcdu)
46 {
47  VCDU_set_ver(vcdu, VCDU_VER_2);
48  VCDU_set_scid(vcdu, VCDU_SCID_SAMPLE_SATELLITE); // FIXME: 仮
50  VCDU_clear_spare_(vcdu);
51 }
52 
53 static void VCDU_clear_spare_(VCDU* vcdu)
54 {
55  unsigned int pos = 5;
56  uint8_t mask = 0x7f; // 01111111b
57 
58  vcdu->header[pos] &= (uint8_t)(~mask);
59 }
60 
62 {
63  unsigned int pos = 0;
64  uint8_t mask = 0xc0; // 11000000b
65 
66  VCDU_VER ver = (VCDU_VER)((vcdu->header[pos] & mask) >> 6);
67 
68  switch (ver)
69  {
70  case VCDU_VER_2:
71  return ver;
72 
73  default:
74  return VCDU_VER_UNKNOWN;
75  }
76 }
77 
78 void VCDU_set_ver(VCDU* vcdu,
79  VCDU_VER ver)
80 {
81  unsigned int pos = 0;
82  uint8_t mask = 0xc0; // 11000000b
83  uint8_t val = (uint8_t)((ver << 6) & mask);
84 
85  vcdu->header[pos] &= (uint8_t)(~mask);
86  vcdu->header[pos] |= val;
87 }
88 
90 {
91  unsigned int pos = 0;
92  uint8_t mask1 = 0x3f; // 00111111b
93  uint8_t mask2 = 0xc0; // 11000000b
94 
95  int scid = (vcdu->header[pos] & mask1);
96  scid <<= 2;
97  scid |= ((vcdu->header[pos + 1] & mask2) >> 6);
98 
99  switch (scid)
100  {
102  return (VCDU_SCID)scid;
103 
104  default:
105  return VCDU_SCID_UNKNOWN;
106  }
107 }
108 
109 void VCDU_set_scid(VCDU* vcdu,
110  VCDU_SCID scid)
111 {
112  unsigned int pos = 0;
113  uint8_t mask1 = 0x3f; // 00111111b
114  uint8_t mask2 = 0xc0; // 11000000b
115 
116  vcdu->header[pos] &= (uint8_t)(~mask1);
117  vcdu->header[pos] |= (uint8_t)((scid >> 2) & mask1);
118  vcdu->header[pos + 1] &= (uint8_t)(~mask2);
119  vcdu->header[pos + 1] |= (uint8_t)((scid << 6) & mask2);
120 }
121 
123 {
124  unsigned int pos = 1;
125  uint8_t mask = 0x3f; // 00111111b
126 
127  VCDU_VCID vcid = (VCDU_VCID)(vcdu->header[pos] & mask);
128 
129  switch (vcid)
130  {
131  case VCDU_VCID_REALTIME: // FALLTHROUGH
132  case VCDU_VCID_REPLAY: // FALLTHROUGH
133  case VCDU_VCID_FILL: // FALLTHROUGH
134  return vcid;
135 
136  default:
137  return VCDU_VCID_UNKNOWN;
138  }
139 }
140 
141 void VCDU_set_vcid(VCDU* vcdu,
142  VCDU_VCID vcid)
143 {
144  unsigned int pos = 1;
145  uint8_t mask = 0x3f; // 00111111b
146 
147  vcdu->header[pos] &= (uint8_t)(~mask);
148  vcdu->header[pos] |= (uint8_t)(vcid & mask);
149 }
150 
151 uint32_t VCDU_get_vcdu_counter(const VCDU* vcdu)
152 {
153  unsigned int pos = 2;
154 
155  uint32_t counter = vcdu->header[pos];
156  counter <<= 8;
157  counter |= vcdu->header[pos + 1];
158  counter <<= 8;
159  counter |= vcdu->header[pos + 2];
160 
161  return counter;
162 }
163 
165  uint32_t counter)
166 {
167  unsigned int pos = 2;
168 
169  vcdu->header[pos] = (uint8_t)((counter >> 16) & 0xff);
170  vcdu->header[pos + 1] = (uint8_t)((counter >> 8) & 0xff);
171  vcdu->header[pos + 2] = (uint8_t)(counter & 0xff);
172 }
173 
175 {
176  unsigned int pos = 5;
177  uint8_t mask = 0x80; // 10000000b
178 
179  return (VCDU_REPLAY_FLAG)((vcdu->header[pos] & mask) >> 7);
180 }
181 
183  VCDU_REPLAY_FLAG flag)
184 {
185  unsigned int pos = 5;
186  uint8_t mask = 0x80; // 10000000b
187 
188  vcdu->header[pos] &= (uint8_t)(~mask);
189  vcdu->header[pos] |= (uint8_t)((flag << 7) & mask);
190 }
191 
192 uint32_t VCDU_get_clcw(const VCDU* vcdu)
193 {
194  unsigned int pos = 0;
195 
196  uint32_t clcw = vcdu->trailer[pos];
197  clcw <<= 8;
198  clcw |= vcdu->trailer[pos + 1];
199  clcw <<= 8;
200  clcw |= vcdu->trailer[pos + 2];
201  clcw <<= 8;
202  clcw |= vcdu->trailer[pos + 3];
203 
204  return clcw;
205 }
206 
207 void VCDU_set_clcw(VCDU* vcdu,
208  uint32_t clcw)
209 {
210  unsigned int pos = 0;
211 
212  vcdu->trailer[pos] = (uint8_t)((clcw >> 24) & 0xff);
213  vcdu->trailer[pos + 1] = (uint8_t)((clcw >> 16) & 0xff);
214  vcdu->trailer[pos + 2] = (uint8_t)((clcw >> 8) & 0xff);
215  vcdu->trailer[pos + 3] = (uint8_t)(clcw & 0xff);
216 }
217 
218 uint32_t VCDU_calc_next_counter(uint32_t prev)
219 {
220  return (prev + 1) % VCDU_COUNTER_MAX;
221 }
222 #pragma section
void M_PDU_setup_idle_m_pdu(M_PDU *m_pdu)
Definition: m_pdu.c:17
void M_PDU_generate_byte_stream(const M_PDU *m_pdu, uint8_t byte_stream[M_PDU_LEN])
Definition: m_pdu.c:8
#define M_PDU_LEN
Definition: m_pdu.h:11
Definition: vcdu.h:12
M_PDU m_pdu
Definition: vcdu.h:14
uint8_t header[VCDU_HEADER_SIZE]
Definition: vcdu.h:13
uint8_t trailer[VCDU_TRAILER_SIZE]
Definition: vcdu.h:15
uint32_t VCDU_get_clcw(const VCDU *vcdu)
Definition: vcdu.c:192
void VCDU_setup_fill_vcdu(VCDU *vcdu)
Definition: vcdu.c:21
void VCDU_set_ver(VCDU *vcdu, VCDU_VER ver)
Definition: vcdu.c:78
void VCDU_setup_realtime_vcdu_hdr(VCDU *vcdu, uint32_t counter)
Definition: vcdu.c:28
void VCDU_set_clcw(VCDU *vcdu, uint32_t clcw)
Definition: vcdu.c:207
static void VCDU_clear_spare_(VCDU *vcdu)
Definition: vcdu.c:53
void VCDU_setup_replay_vcdu_hdr(VCDU *vcdu, uint32_t counter)
Definition: vcdu.c:36
VCDU_REPLAY_FLAG VCDU_get_replay_flag(const VCDU *vcdu)
Definition: vcdu.c:174
uint32_t VCDU_get_vcdu_counter(const VCDU *vcdu)
Definition: vcdu.c:151
VCDU_VER VCDU_get_ver(const VCDU *vcdu)
Definition: vcdu.c:61
static void VCDU_set_common_hdr_(VCDU *vcdu)
Definition: vcdu.c:45
uint32_t VCDU_calc_next_counter(uint32_t prev)
Definition: vcdu.c:218
void VCDU_set_vcid(VCDU *vcdu, VCDU_VCID vcid)
Definition: vcdu.c:141
void VCDU_generate_byte_stream(const VCDU *vcdu, uint8_t byte_stream[VCDU_LEN])
Definition: vcdu.c:9
VCDU_SCID VCDU_get_scdi(const VCDU *vcdu)
Definition: vcdu.c:89
void VCDU_set_scid(VCDU *vcdu, VCDU_SCID scid)
Definition: vcdu.c:109
void VCDU_set_vcdu_counter(VCDU *vcdu, uint32_t counter)
Definition: vcdu.c:164
void VCDU_set_replay_flag(VCDU *vcdu, VCDU_REPLAY_FLAG flag)
Definition: vcdu.c:182
VCDU_VCID VCDU_get_vcid(const VCDU *vcdu)
Definition: vcdu.c:122
VCDU_SCID
Definition: vcdu.h:25
@ VCDU_SCID_SAMPLE_SATELLITE
Definition: vcdu.h:26
@ VCDU_SCID_UNKNOWN
Definition: vcdu.h:27
VCDU_VCID
Definition: vcdu.h:31
@ VCDU_VCID_REALTIME
Definition: vcdu.h:32
@ VCDU_VCID_REPLAY
Definition: vcdu.h:33
@ VCDU_VCID_UNKNOWN
Definition: vcdu.h:35
@ VCDU_VCID_FILL
Definition: vcdu.h:34
#define VCDU_TRAILER_SIZE
Definition: vcdu.h:7
VCDU_REPLAY_FLAG
Definition: vcdu.h:39
@ VCDU_REPLAY_TRUE
Definition: vcdu.h:41
@ VCDU_REPLAY_FALSE
Definition: vcdu.h:40
#define VCDU_LEN
Definition: vcdu.h:8
#define VCDU_COUNTER_MAX
Definition: vcdu.h:9
#define VCDU_HEADER_SIZE
Definition: vcdu.h:6
VCDU_VER
Definition: vcdu.h:19
@ VCDU_VER_2
Definition: vcdu.h:20
@ VCDU_VER_UNKNOWN
Definition: vcdu.h:21