source: trunk/src/data_sources/scream2ew/gcf.c @ 2150

Revision 2150, 5.2 KB checked in by paulf, 14 years ago (diff)

new installment of scream2ew from GSL

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
Line 
1/*
2 * gcf.c:
3 *
4 * Copyright (c) 2003 Guralp Systems Limited
5 * Author James McKenzie, contact <software@guralp.com>
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 *
21 */
22
23static char rcsid[] = "$Id$";
24
25/*
26 * $Log$
27 * Revision 1.3  2006/05/02 16:25:59  paulf
28 *  new installment of scream2ew from GSL
29 *
30 * Revision 1.1  2003/03/27 18:07:18  alex
31 * Initial revision
32 *
33 * Revision 1.4  2003/02/28 17:05:37  root
34 * #
35 *
36 */
37
38#include "project.h"
39
40static time_t
41gcf_time_to_time_t (gcf_time * t)
42{
43  time_t ret = GCF_EPOCH;
44
45  ret += (t->day) * 24 * 60 * 60;
46  ret += (t->sec);
47
48  return ret;
49}
50
51static int
52extract_8 (gcf_block b)
53{
54  uint8_t *ptr = b->buf;
55  int *optr = b->data;
56
57  int val;
58  int n = b->samples;
59
60  ptr += 16;
61
62  val = gp_int32 (ptr);
63  ptr += 4;
64
65  if (*ptr) {
66    warning(("First difference is not zero"));
67    return 1;
68  }
69  while (n--)
70    {
71      val += gp_int8 (ptr++);
72      *(optr++) = val;
73    }
74  b->fic = val;
75  b->ric = gp_int32 (ptr);
76
77  if (b->fic != b->ric) {
78    warning(("Fic!=Ric"));
79    return 1;
80  }
81
82  return 0;
83}
84
85static int
86extract_16 (gcf_block b)
87{
88  uint8_t *ptr = b->buf;
89  int *optr = b->data;
90
91  int val;
92  int n = b->samples;
93
94  ptr += 16;
95
96  val = gp_int32 (ptr);
97  ptr += 4;
98
99  if (*ptr) {
100    warning(("First difference is not zero"));
101    return 1;
102  }
103
104  while (n--)
105    {
106      val += gp_int16 (ptr);
107      ptr += 2;
108      *(optr++) = val;
109    }
110  b->fic = val;
111  b->ric = gp_int32 (ptr);
112
113  if (b->fic != b->ric) {
114    warning(("Fic!=Ric"));
115    return 1;
116  }
117 
118  return 0;
119}
120
121static int
122extract_24 (gcf_block b)
123{
124  uint8_t *ptr = b->buf;
125  int *optr = b->data;
126
127  int val;
128  int n = b->samples;
129
130  ptr += 16;
131
132  if ((*ptr) && (0xff != *ptr)) {
133    warning(("claimed 24 bit data isn't"));
134    return 1;
135  }
136
137  val = gp_int32 (ptr);
138  ptr += 4;
139
140  if (gp_int24 (ptr)) {
141    warning(("First difference is not zero"));
142    return 1;
143  }
144
145  while (n--)
146    {
147      val += gp_uint24 (ptr);
148      ptr += 3;
149      while (val >= 0x800000L)
150        val -= 0x1000000L;
151      *(optr++) = val;
152    }
153  b->fic = val;
154  if ((*ptr) && (0xff != *ptr)) {
155    warning(("claimed 24 bit data isn't"));
156    return 1;
157  }
158
159  b->ric = gp_int32 (ptr);
160
161
162  if (b->fic != b->ric) {
163    warning(("Fic!=Ric"));
164    return 1;
165  }
166
167  return 0;
168}
169
170static int
171extract_32 (gcf_block b)
172{
173  uint8_t *ptr = b->buf;
174  int *optr = b->data;
175
176  uint32_t uval;
177  int32_t val;
178
179  int n = b->samples;
180
181  ptr += 16;
182
183  uval = gp_uint32 (ptr);
184  ptr += 4;
185
186  if (*ptr) {
187    warning(("First difference is not zero"));
188    return 1;
189  }
190
191  while (n--)
192    {
193      uval += gp_uint32 (ptr);
194      ptr += 4;
195
196      if (uval == 0x80000000UL)
197        {
198          val = -0x80000000L;
199        }
200      else if (uval & 0x80000000UL)
201        {
202          val = -1 - (int32_t) (0xffffffffUL - uval);
203        }
204      else
205        {
206          val = (int32_t) uval;
207        }
208
209      *(optr++) = (int) val;
210    }
211
212  b->fic = (int) val;
213  b->ric = gp_int32 (ptr);
214
215  if (b->fic != b->ric) {
216    warning(("Fic!=Ric"));
217    return 1;
218  }
219 
220  return 0;
221}
222
223
224
225int
226gcf_dispatch (uint8_t * buf, int sz)
227{
228  int i;
229  struct gcf_block_struct block;
230  uint8_t *ptr;
231  int err = 0;
232
233  block.buf = buf;
234  block.size = sz;
235  block.csize = 0;
236
237  strcpy (block.sysid, gp_base36_to_a (gp_uint32 (buf)));
238  strcpy (block.strid, gp_base36_to_a (gp_uint32 (buf + 4)));
239
240  i = gp_uint16 (buf + 8);
241  block.start.day = i >> 1;
242  i &= 1;
243  i <<= 16;
244  block.start.sec = i | gp_uint16 (buf + 10);
245
246  block.estart = gcf_time_to_time_t (&block.start);
247
248  block.sample_rate = buf[13];
249  block.format = buf[14] & 7;
250  block.records = buf[15];
251  block.samples = (block.format) * (block.records);
252
253  block.text = buf + 16;
254
255  if (block.sample_rate)
256    {
257      switch (block.format)
258        {
259        case 4:
260          block.csize = 24 + block.samples;
261          err = extract_8 (&block);
262          break;
263        case 2:
264          block.csize = 24 + (2 * block.samples);
265          err = extract_16 (&block);
266          break;
267        case 1:
268          if ((sz - 24) == (4 * block.samples))
269            {
270              block.csize = 24 + (4 * block.samples);
271              err = extract_32 (&block);
272            }
273          else if ((sz - 24) == (3 * block.samples))
274            {
275              block.csize = 24 + (3 * block.samples);
276              err = extract_24 (&block);
277            }
278          else
279            {
280              /* Guess 32 */
281              err = extract_32 (&block);
282            }
283          break;
284        default:
285          warning(("unknown GCF compression format"));
286          err = 1;
287        }
288    }
289
290  if(!err) dispatch (&block);
291  return err;
292}
Note: See TracBrowser for help on using the repository browser.