123

Dependencies:   mbed

Fork of LG by igor Apu

Device.c

Committer:
Diletant
Date:
2016-05-09
Revision:
156:e68ee0bcdcda
Parent:
149:abbf7663d27d
Child:
161:efd949e8d536

File content as of revision 156:e68ee0bcdcda:

#include "Device.h"

Device device;
HashParam hashParamTable[HASH_PARAM_COUNT];
HashFunc  hashFuncTable[HASH_FUNC_COUNT];

void InitDevice(void)
{
  //Init system
  SystemInit1();  // Инициализация контроллера: установка тактовых частот
  SystemCoreClockUpdate1(); // расчет тактовой частоты процессора перед инициализацией UART - 100MHz
  
  //Load default settings
  DeviceInitAllWithDefaults();
  
  //Load from flash - override defaults
  DeviceFlashReadAll();

  //Final initialization
  DeviceInitAll();
}

void DeviceStart(void){
  DeviceEnableMeasurementTimer();
  DeviceEnableRegularTimer();
  DevicePhotoDetectorSetPotentiometers();
  DeviceStartLightUp();
  DeviceStartDither();
}

void DeviceInitAllWithDefaults(void){
  device.settings.address = 0;
  
  //Init transmitter variables
  device.host.transmitter.position = 0;
  
  //Init controller
  InitControllerWithDefaults();
  
  //Init units
  InitHostProtocolWithDefaults();
  InitCountersWithDefaults();
  InitLightUpWithDefaults();
  InitPhotoDetectorWithDefaults();
  InitDitherWithDefaults();
  InitDACWithDefaults();
  InitPathLengthControlSystemWithDefaults();
}

void DeviceInitAll(void){
  //Init measurement cycle
  device.measurement.counter = 0;
  device.measurement.length = 32;
  //Init regular cycle
  device.regular.event1Hz = 0;
  device.regular.event500Hz = 0;
  device.regular.event1K = 0;
  device.regular.event10K = 0;
  device.regular.event100K = 0;
  device.regular.time100K = 0;
  device.regular.time10K = 0;
  device.regular.time1K = 0;
  device.regular.time500Hz = 0;
  device.regular.time1Hz = 0;
  
  //Init controller
  InitController();
  
  //Init host commununication protocol
  InitHostProtocol();
  //Init counters
  InitCounters();
  //Init light-up and back light unit
  InitLightUp();
  //Init photo detector
  InitPhotoDetector();
  //Init dither
  InitDither();
  //Init DAC of hfo & plcs
  InitDAC();
  //Init path length control system
  InitPathLengthControlSystem();
}

void DeviceRegularEvent1Hz(void) {
    if (device.regular.event1Hz) {
       device.regular.event1Hz--;
       device.regular.time1Hz++;
       
       DeviceLightUpCycle();
    }
}

void DeviceRegularEvent500Hz(void) {
    if (device.regular.event500Hz) {
        device.regular.event500Hz--;
    }
}

void DeviceRegularEvent1KHz(void) {
    if (device.regular.event1K) {
        device.regular.event1K--;
        device.regular.time1K++;
        device.regular.time500Hz++;
        if (device.regular.time1K == 1000) {
            device.regular.time1K = 0;
            device.regular.event1Hz++;
        }
        if (device.regular.time500Hz == 2) {
            device.regular.time500Hz = 0;
            device.regular.event500Hz++;
       }
    }
}

void DeviceRegularEvent10KHz(void) {
    if (device.regular.event10K) {
        device.regular.event10K--;
        device.regular.time10K++;
        if (device.regular.time10K == 10){
            device.regular.time10K = 0;
            device.regular.event1K++;
        }
        
        if ((device.host.response.type == RESPONSE_DELAYED) || (device.host.response.type == RESPONSE_PERIODIC)){
            device.host.response.counter += 100;
            if (device.host.response.counter > device.host.response.trigger) {
                device.host.response.triggered = 1;
                device.host.response.counter = 0;
            }
        }
    }
}

void DeviceRegularEvent100KHz(void) {
  if (device.regular.event100K) {
    device.regular.event100K--;
    
    device.regular.time100K++;
    if (device.regular.time100K == 10) {
      device.regular.time100K = 0;
      device.regular.event10K++;
    }
    
    DeviceDitherCycle(); //Set/reset vibro 1/2 pins
  }
}

void DeviceMeasurementInterruptHandler(void) {
  //Read QEI
  DeviceQEIRead();
  //Count
  DeviceCount();
  
  //Receive ADCs samples using SSP
  DeviceSSPReceive();
  //Transmit DACs values using SSP
  DeviceSSPTransmit(device.measurement.counter & 1);
  
  //Update measurement cycle counter
  device.measurement.counter++;
  if (device.measurement.counter == device.measurement.length) device.measurement.counter = 0;
  //Reset dither 10mks resolution counter
  if (device.measurement.counter == 0) device.dither.state.counter = 0; //First dither half period
  if (device.measurement.counter == 16) device.dither.state.counter = 0;//Second dither half period
}

void DeviceRegularInterruptHandler(void) {
  device.regular.event100K++;
  device.dither.state.counter++; //Dither 10 mks resolution counter
}

/*
int32_t FindByHash(uint32_t hash){
  for (uint32_t i = 0; i < HASH_PARAM_COUNT; i++){
    if (hashParamTable[i].hash == hash) return i;
  }
  return -1;
}
*/