7.0.4 WIN7 64, новый редактор, Си.
Не собирается проект из-за того что компилятор размещает объявление функции для работы с нелинейным масштабированием позже чем они начинают использоваться моим компонентом. int _poligon(int value, int intArray[], int outArray[], int arraySize).
Можно ли посадить ее прототип в секцию Declare ? Возможно, это решит проблему. Не представляю как побороть это автоматически. Листинг части программы:
#ifndef sbit
#define sbit(reg,bite) (reg |=(1<<bite))
#endif
#ifndef cbit
#define cbit(reg,bite) (reg &=~(1<<bite))
#endif
struct _poligonInexes
{
int minIndex;
int maxIndex;
}
;
int _Poligon_InArray_1[12] = {176, 189, 203, 217, 231, 238, 245, 260, 274, 289, 303, 318};
int _Poligon_OutArray_1[12] = {-20, -10, 0, 10, 20, 25, 30, 40, 50, 60, 70, 80};
int _Poligon_InArray_2[12] = {176, 189, 203, 217, 231, 238, 245, 260, 274, 289, 303, 318};
int _Poligon_OutArray_2[12] = {-20, -10, 0, 10, 20, 25, 30, 40, 50, 60, 70, 80};
int _Poligon_InArray_3[12] = {176, 189, 203, 217, 231, 238, 245, 260, 274, 289, 303, 318};
int _Poligon_OutArray_3[12] = {-20, -10, 0, 10, 20, 25, 30, 40, 50, 60, 70, 80};
unsigned long _stou1 = 0UL;
unsigned long _stou2 = 0UL;
unsigned long _stou3 = 0UL;
#define ADLAR_VALUE (0<<ADLAR)
#define ADC_10BIT_MODE
#define ADC_CH_NUM_USED 5
#define ADC_VREF_TYPE ((0<<REFS1) | (0<<REFS0) | ADLAR_VALUE)
#define ADC_CH_SEL_MSK ((1<<MUX0)|(1<<MUX1)|(1<<MUX2)|(1<<MUX3)|(1<<MUX4))
#define SET_ADC_8BIT() sbit(ADMUX,ADLAR);
#define SET_ADC_10BIT() cbit(ADMUX,ADLAR);
enum ADC_CHANNELS
{
ADC0,ADC1,ADC2,ADC3,ADC4,ADC5,ADC6,ADC7,ADCnum
}
;
volatile int adc[ADC_CH_NUM_USED];
volatile byte adc_ch = 0; //номер канала, индекс
byte adc_ch_list[]={0,1,2,3,4};
void adc_init(void);
void adc_set_channel(uint8_t ch);
void adc_start(void);
inline int ch_to_idx(byte ch);
int adc_read(byte ch);
#define ADC_CH(x) (ADMUX=(1<<6)|(x & 0x07))
class Anfilt
{
public:
Anfilt(byte analog_channel=0,int filt_time=1,byte datalen=8)
{
_filt_time = filt_time;
_ch = analog_channel;
idx = 0;
_datalen = datalen;
_data = new int[datalen];
}
byte getChannel()
{
return _ch;
}
int getValue()
{
return _output_value;
}
void poll()
{
if(millis()-_last_time > _filt_time/_datalen)
{
_add_value(adc_read(_ch));
_last_time = millis();
}
}
private:
void _add_value(int val)
{
long sum = 0;
_data[idx++] = val;
if(idx > _datalen-1)
{
idx = 0;
}
for(byte i=0; i<_datalen; i++)
{
sum += _data;
}
_output_value = sum/_datalen;
}
//int _data[ITEMS_LEN];
int *_data;
byte _datalen;
byte idx;
byte _ch;
int _filt_time;
int _output_value;
u32 _last_time;
}
;
Anfilt filter204995269(((_poligon(((adc_read(1))), _Poligon_InArray_1, _Poligon_OutArray_1, 12))),1000,16);
Anfilt filter262981174(((_poligon(((adc_read(2))), _Poligon_InArray_2, _Poligon_OutArray_2, 12))),1000,16);
Anfilt filter257934932(((_poligon(((adc_read(3))), _Poligon_InArray_3, _Poligon_OutArray_3, 12))),1000,16);
void setup()
{
adc_init();
adc_start();
analogReference(EXTERNAL);
Serial1.begin(9600, SERIAL_8N1);
_stou1 = millis();
_stou2 = millis();
_stou3 = millis();
}
void loop()
{
//Плата:1
//Наименование:Чтение аналоговых сигналов
257934932.poll();
if(!(0))
{
if (_isTimer(_stou3, 1000))
{
Serial1.println((257934932.getValue()));
_stou3 = millis();
}
}
else
{
_stou3 = millis();
}
262981174.poll();
if(!(0))
{
if (_isTimer(_stou2, 1000))
{
Serial1.println((262981174.getValue()));
_stou2 = millis();
}
}
else
{
_stou2 = millis();
}
204995269.poll();
if(!(0))
{
if (_isTimer(_stou1, 1000))
{
Serial1.println((204995269.getValue()));
_stou1 = millis();
}
}
else
{
_stou1 = millis();
}
}
bool _isTimer(unsigned long startTime, unsigned long period)
{
unsigned long currentTime;
currentTime = millis();
if (currentTime>= startTime)
{
return (currentTime>=(startTime + period));
}
else
{
return (currentTime >=(4294967295-startTime+period));
}
}
int _poligon(int value, int intArray[], int outArray[], int arraySize)
{
struct _poligonInexes indexes;
indexes = _getPoligonIndexes(value, intArray, arraySize);
return map(value, intArray[indexes.minIndex], intArray[indexes.maxIndex], outArray[indexes.minIndex], outArray[indexes.maxIndex]);
}