OSDN Git Service

1sec and high smpling file record add.
[scilog/scilog.git] / ad_ring.c
1 #include <pthread.h>
2 #include <semaphore.h> 
3
4
5 #include "ring.h"
6 #include "ad_ring.h"
7 #include "mes_print.h"
8
9 // Ring Buffer読み込みポインタ個数
10 #define AD_RING_READ_NUM        2
11 // Ring Buffer読み込みポインター 1sec記録用
12 #define AD_RING_READ_PTR1       0
13 // Ring Buffer読み込みポインター 1min記録用
14 #define AD_RING_READ_PTR2       1
15
16 static AdData   ad_ring_buf[AD_RING_NUM];
17
18 // ミューテックス
19 static pthread_mutex_t  mutex_ad_ring = PTHREAD_MUTEX_INITIALIZER;
20
21 // Ring buffer
22 static RING_T   *ring;
23
24 int ad_ring_init(void)
25 {
26 pthread_mutex_lock(&mutex_ad_ring);
27         ring = ring_create(AD_RING_READ_NUM);
28         if (ring == NULL) {
29                 PERRF("ERROR ring_create() == NULL\n");
30 pthread_mutex_unlock(&mutex_ad_ring);
31                 return -1;
32         }
33         ring_init(ring, AD_RING_NUM);
34 pthread_mutex_unlock(&mutex_ad_ring);
35         return 0;
36 }
37 void ad_ring_clear_sec(void)
38 {
39         ring_clear(ring, AD_RING_READ_PTR1);
40 }
41 void ad_ring_clear_high(void)
42 {
43         ring_clear(ring, AD_RING_READ_PTR2);
44 }
45 void ad_ring_clear_latest(void)
46 {
47         ring_latest_set(ring, -1);
48 }
49
50 // 読み出し位置 1secデータ記録で使用
51 int ad_ring_read_get_sec(void)
52 {
53         return ring_read_get(ring, AD_RING_READ_PTR1);
54 }
55 void ad_ring_read_set_sec(int i)
56 {
57         ring_read_set(ring, AD_RING_READ_PTR1, i);
58 }
59 void ad_ring_read_plus_sec(void)
60 {
61         ring_read_plus(ring, AD_RING_READ_PTR1);
62 }
63 // 読み出し位置 高速データ記録で使用
64 int ad_ring_read_get_high(void)
65 {
66         return ring_read_get(ring, AD_RING_READ_PTR2);
67 }
68 void ad_ring_read_set_high(int i)
69 {
70         ring_read_set(ring, AD_RING_READ_PTR2, i);
71 }
72 void ad_ring_read_plus_high(void)
73 {
74         ring_read_plus(ring, AD_RING_READ_PTR2);
75 }
76
77 // 書き込み位置 AD受信で使用
78 int ad_ring_write_get(void)
79 {
80         return ring_write_get(ring);
81 }
82 void ad_ring_write_plus(void)
83 {
84         ring_write_plus(ring);
85 }
86 // 読み込んでいないデータ数
87 int ad_ring_num_get_sec(void)
88 {
89         return ring_num_get(ring, AD_RING_READ_PTR1);
90 }
91 // 読み込んでいないデータ数
92 int ad_ring_num_get_high(void)
93 {
94         return ring_num_get(ring, AD_RING_READ_PTR2);
95 }
96 // 最新データ位置 表示
97 int ad_ring_latest_get(void)
98 {
99         return ring_latest_get(ring);
100 }
101 void ad_ring_latest_set(int i)
102 {
103         ring_latest_set(ring, i);
104 }
105 // データ取得
106 AdData* ad_ring_get(int ptr)
107 {
108         AdData* p;
109 pthread_mutex_lock(&mutex_ad_ring);
110         p = &ad_ring_buf[ptr];
111 pthread_mutex_unlock(&mutex_ad_ring);
112         return p;
113 }
114 /*
115         バッファにデータコピー
116 */
117 void ad_ring_set(AdData *data)
118 {
119         int     i;
120         
121 pthread_mutex_lock(&mutex_ad_ring);
122         i = ring_write_get(ring);
123         ad_ring_buf[i] = *data;
124         // 最新データ位置セット
125         ring_latest_set(ring, i);
126 pthread_mutex_unlock(&mutex_ad_ring);
127 }
128
129 /*
130         パケットバッファフル?
131         1=Full
132         0=not Full
133 */
134 int ad_ring_is_full(void)
135 {
136         return ring_is_full(ring, AD_RING_READ_PTR1);
137 }
138
139
140 /**** CUnit test
141 */
142 #ifdef CUNIT
143 static void test_ad_ring(void)
144 {
145         ad_ring_init();
146
147         // CLEAR
148         ad_ring_clear_sec();
149         CU_ASSERT(ad_ring_read_get_sec() == 0);
150         ad_ring_clear_high();
151         CU_ASSERT(ad_ring_read_get_high() == 0);
152         ad_ring_clear_latest();
153         CU_ASSERT(ad_ring_latest_get() == -1);
154
155         // PLUS
156         ad_ring_read_plus_sec();
157         CU_ASSERT(ad_ring_read_get_sec() == 1);
158         ad_ring_read_plus_high();
159         CU_ASSERT(ad_ring_read_get_high() == 1);
160         ad_ring_write_plus();
161         CU_ASSERT(ad_ring_write_get() == 1);
162
163         // 境界値でPLUS
164         ad_ring_read_set_sec(AD_RING_NUM - 1);
165         ad_ring_read_plus_sec();
166         CU_ASSERT(ad_ring_read_get_sec() == 0);
167
168         ad_ring_read_set_high(AD_RING_NUM - 1);
169         ad_ring_read_plus_high();
170         CU_ASSERT(ad_ring_read_get_high() == 0);
171
172         ring->write = AD_RING_NUM - 1;
173         ad_ring_write_plus();
174         CU_ASSERT(ad_ring_write_get() == 0);
175         
176         //
177         ring->write = 1;
178         ring->read[AD_RING_READ_PTR1] = 0;
179         CU_ASSERT(ad_ring_num_get_sec() == 1);
180
181         ring->write = 0;
182         ring->read[AD_RING_READ_PTR1] = AD_RING_NUM - 1;
183         CU_ASSERT(ad_ring_num_get_sec() == 1);
184
185         ring->write = 1;
186         ring->read[AD_RING_READ_PTR2] = 0;
187         CU_ASSERT(ad_ring_num_get_high() == 1);
188
189         ring->write = 0;
190         ring->read[AD_RING_READ_PTR2] = AD_RING_NUM - 1;
191         CU_ASSERT(ad_ring_num_get_high() == 1);
192
193 }
194
195 void ad_ring_test(CU_pSuite test_suite)
196 {
197         CU_add_test(test_suite, "test_ad_ring", test_ad_ring);
198
199 }
200 #endif