SM_ADC  1.0
Приём данных АЦП через разделяемую память
sm_adc.cpp
Go to the documentation of this file.
1 //------------------------------------------------------------------------------
2 /* C++ S-function that shows all the different ways to use the output ports.
3  *
4  * To compile this C++ S-function, enter the following command in MATLAB:
5  *
6  * >>make sfun_outputs.cpp
7  *
8  */
9 
10 #include "sm_adc.h"
11 #include "TF_SimulinkShared.h"
12 
13 //------------------------------------------------------------------------------
15 {
16  printf("Starting the s-function for outputs testing...\n");
17 
18  //waveform = new double[blockSize];
19  //cnt=10;
20  //flag=0;
21  flagLowVal_0=0;
22  flagLowVal_1=0;
23 
24  flagError=0;
25  indexReq=0;
26  indexWr=0;
27 
30 
31  m_DataSize = blockSize; // к этому моменту размер выходного массива уже определён
32 
33  //if( m_DataSize<1 || m_DataSize>256*1024 )
34  //{
35  // m_DataSize=512;
36  //}
37  //outputPortRows[0]=m_DataSize;
38 
39  printf( "DATA_SIZE=%d\n", m_DataSize );
40  printf( "FNAME = %s\n", m_SharedFileName.c_str() );
41 
42  m_pSimulinkShared = new TF_SimulinkShared( "SimulinkAdc" );
43 
44  U32 timeout=0;
45  for( ; ; )
46  {
47  U32 flag = m_pSimulinkShared->GetFlag( 1 ); // SIG
48  if( 0xAA55 == flag )
49  {
50  break;
51  }
52  Sleep( 1 );
53  timeout++;
54 
55  if( timeout>60*1000 )
56  {
57  flagError=1;
58  return;
59  }
60  }
61 
62 
63  m_pSimulinkShared->SetFlag( 2, 0xB422 ); // START
64  for( ; ; )
65  {
66  U32 flag = m_pSimulinkShared->GetFlag( 2 ); // START
67  if( 0xB410 == flag )
68  {
69  // Сеанс моделирования запущен
70  break;
71  }
72  Sleep( 1 );
73  timeout++;
74  if( timeout>60*1000 )
75  {
76  flagError=2;
77  return;
78  }
79 
80  flag = m_pSimulinkShared->GetFlag( 1 );
81  if( 0==flag )
82  {
83  flagError=21;
84  return;
85  }
86 
87  }
88  m_pSimulinkShared->SetFlag( 2, 0xB000 ); // START
89 
90 }
91 
93 {
94 
95  if( flagError )
96  return;
97 
98 
99  double start = getInputDouble(START_IN);
100  double get_data = getInputDouble(GET_DATA);
101 
102  if( start<0.4 )
103  {
104  flagLowVal_0=1;
105  if( 1==flagHighVal_0 )
106  {
108  flagHighVal_0=0;
109  }
110  }
111 
112  if( get_data<0.4 )
113  {
114  flagLowVal_1=1;
115  }
116 
117  //printf("---------- time = %f ----------\n",ssGetT(simStruct));
118  //printf("output port %i = 7\n",DATA);
119  //setOutputDouble(OUT1,7);
120 
121  //out2.init(1);
122  //out2[1]=2;
123  //out2.print();
124  //setOutputArray(OUT2,out2);
125 
126  //out3.init(3);
127  //out3(0,2)=4;
128  //out3.print();
129  //setOutputArray(OUT3,out3);
130 
132 
133  if( (start>0.5) && (flagLowVal_0==1) )
134  {
135  flagLowVal_0=0;
136 
137  indexReq++;
139 
140  U32 timeout=0;
141  U32 flag;
142  for( ; ; )
143  {
144  flag = m_pSimulinkShared->GetFlag( 11 );
145  if( flag==indexReq )
146  {
147  break;
148  }
149  timeout++;
150  if( timeout>10000 )
151  {
152  Sleep(1);
153  }
154  if( timeout>60000 )
155  {
156  flagError=4;
157  break;
158  }
159 
160  flag = m_pSimulinkShared->GetFlag( 2 ); // START
161  if( 0==flag )
162  {
163  flagError=5; // Перезапуск программы сбора
164  }
165 
166  flag = m_pSimulinkShared->GetFlag( 1 ); // SIG
167  if( 0==flag )
168  {
169  flagError=6; // Перезапуск программы сбора
170  }
171  }
172 
173 
174 
175 
177  flagHighVal_0 = 1;
178  }
179 
180  if( (get_data>0.5) && (flagLowVal_1==1 ))
181  {
182  flagLowVal_1=0;
183  Array outArray( m_DataSize, 1 );
184 
185  U32 timeout=0;
186  U32 flag;
187  for( ; ; )
188  {
189  flag = m_pSimulinkShared->GetFlag( 20 );
190  if( flag!=indexWr )
191  {
192  break;
193  }
194  timeout++;
195  if( timeout>10000 )
196  {
197  Sleep(1);
198  }
199  if( timeout>60000 )
200  {
201  flagError=5;
202  break;
203  }
204 
205  flag = m_pSimulinkShared->GetFlag( 2 ); // START
206  if( 0==flag )
207  {
208  flagError=5; // Перезапуск программы сбора
209  }
210 
211  flag = m_pSimulinkShared->GetFlag( 1 ); // SIG
212  if( 0==flag )
213  {
214  flagError=6; // Перезапуск программы сбора
215  }
216  }
217  // Получение данных
218  {
219  double *ptr = (double*)(m_pSimulinkShared->GetBuf());
220  for( int ii=0; ii<m_DataSize; ii++ )
221  {
222  outArray[ii]=*ptr++;
223  }
224  }
225 
226 
227  indexWr++;
229 
230  //if( 0==flag )
231  //{
232  // for( int ii=0; ii<blockSize; ii++ )
233  // {
234  // outArray[ii]=ii%cnt;
235  // }
236  // flag=1;
237  //} else
238  //{
239  // for( int ii=0; ii<blockSize; ii++ )
240  // {
241  // outArray[ii]=(blockSize-ii-1)%cnt;
242  // }
243  // flag=0;
244  //}
245 
246  setOutputArray(DATA,outArray);
247 
248  }
249 
250 
251 
252  //data = cnt++;
253  //setOutputDouble(DATA, data);
254  //if( cnt==blockSize )
255  //{
256  // cnt=0;
257  //}
258 }
259 
261 {
262  printf("Terminating the s-function for outputs testing.\n");
263 // delete[] waveform;
264 }
265 
Definition: sm_adc.h:73
Definition: array.h:29
int flagError
Definition: sm_adc.h:116
static double getInputDouble(int port)
Definition: baseblock.h:326
unsigned indexWr
Definition: sm_adc.h:119
int flagLowVal_0
Definition: sm_adc.h:110
static string getParameterString(int port)
Definition: baseblock.h:476
unsigned indexReq
Definition: sm_adc.h:118
static void setOutputDouble(int port, double value)
Definition: baseblock.h:390
static void setOutputArray(int port, Array &array)
Definition: baseblock.h:399
void outputs()
Definition: sm_adc.cpp:92
static int getParameterInt(int port)
Definition: baseblock.h:468
void start()
Definition: sm_adc.cpp:14
void terminate()
Definition: sm_adc.cpp:260
int flagHighVal_0
Definition: sm_adc.h:113
const int blockSize
Definition: sm_adc.h:85
string m_SharedFileName
Definition: sm_adc.h:122
Definition: sm_adc.h:93
TF_SimulinkShared * m_pSimulinkShared
Definition: sm_adc.h:124
static void initializeSampleTimes()
Definition: baseblock.h:243
int m_DataSize
Definition: sm_adc.h:121
int flagLowVal_1
Definition: sm_adc.h:111