diff --git a/software/Basic_Blink/.cproject b/software/Basic_Blink/.cproject new file mode 100644 index 0000000..67c056d --- /dev/null +++ b/software/Basic_Blink/.cproject @@ -0,0 +1,151 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + make + -f ${ProjDirPath}/Makefile + all + true + true + true + + + make + -f ${ProjDirPath}/Makefile + clean + true + true + true + + + make + -f ${ProjDirPath}/Makefile + flash + true + true + true + + + make + -f ${ProjDirPath}/Makefile + flashonefile + true + true + true + + + make + -f ${ProjDirPath}/Makefile + flashinit + true + true + true + + + make + -f ${ProjDirPath}/Makefile + flashboot + true + true + true + + + make + -f ${ProjDirPath}/Makefile + rebuild + true + true + true + + + + + + + + + + + + + + + + + + + + diff --git a/software/Basic_Blink/.project b/software/Basic_Blink/.project new file mode 100644 index 0000000..045ddec --- /dev/null +++ b/software/Basic_Blink/.project @@ -0,0 +1,28 @@ + + + Basic_Blink + + + SmingFramework + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + clean,full,incremental, + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + org.eclipse.cdt.core.cnature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + diff --git a/software/Basic_Blink/.settings/language.settings.xml b/software/Basic_Blink/.settings/language.settings.xml new file mode 100644 index 0000000..f80ea40 --- /dev/null +++ b/software/Basic_Blink/.settings/language.settings.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/software/Basic_Blink/Makefile b/software/Basic_Blink/Makefile new file mode 100644 index 0000000..16d76cd --- /dev/null +++ b/software/Basic_Blink/Makefile @@ -0,0 +1,24 @@ +##################################################################### +#### Please don't change this file. Use Makefile-user.mk instead #### +##################################################################### +# Including user Makefile. +# Should be used to set project-specific parameters +include ./Makefile-user.mk + +# Important parameters check. +# We need to make sure SMING_HOME and ESP_HOME variables are set. +# You can use Makefile-user.mk in each project or use enviromental variables to set it globally. + +ifndef SMING_HOME +$(error SMING_HOME is not set. Please configure it in Makefile-user.mk) +endif +ifndef ESP_HOME +$(error ESP_HOME is not set. Please configure it in Makefile-user.mk) +endif + +# Include main Sming Makefile +ifeq ($(RBOOT_ENABLED), 1) +include $(SMING_HOME)/Makefile-rboot.mk +else +include $(SMING_HOME)/Makefile-project.mk +endif diff --git a/software/Basic_Blink/Makefile-user.mk b/software/Basic_Blink/Makefile-user.mk new file mode 100644 index 0000000..07057cf --- /dev/null +++ b/software/Basic_Blink/Makefile-user.mk @@ -0,0 +1,39 @@ +## Local build configuration +## Parameters configured here will override default and ENV values. +## Uncomment and change examples: + +## Add your source directories here separated by space +# MODULES = app +# EXTRA_INCDIR = include + +## ESP_HOME sets the path where ESP tools and SDK are located. +## Windows: +# ESP_HOME = c:/Espressif + +## MacOS / Linux: +# ESP_HOME = /opt/esp-open-sdk + +## SMING_HOME sets the path where Sming framework is located. +## Windows: +# SMING_HOME = c:/tools/sming/Sming + +## MacOS / Linux +# SMING_HOME = /opt/sming/Sming + +## COM port parameter is reqruied to flash firmware correctly. +## Windows: + COM_PORT = COM13 + +## MacOS / Linux: +# COM_PORT = /dev/tty.usbserial + +## Com port speed +COM_SPEED = 460800 + +## Configure flash parameters (for ESP12-E and other new boards): +# SPI_MODE = dio + +## SPIFFS options +DISABLE_SPIFFS = 1 +# SPIFF_FILES = files + diff --git a/software/Basic_Blink/app/adc.h b/software/Basic_Blink/app/adc.h new file mode 100644 index 0000000..85628c1 --- /dev/null +++ b/software/Basic_Blink/app/adc.h @@ -0,0 +1,27 @@ +/* + * adc.h + * + * Created on: Jul 20, 2017 + * Author: Elmar + */ + +#ifndef APP_ADC_H_ +#define APP_ADC_H_ + +#include "sensor.h" + +namespace rijnfel { + +template +class cADC: public cSensor { +public: + cADC() { + + } + virtual Voltage ConvertSample(Sample & sample) = 0; + virtual ~cADC() { + + } +}; +} +#endif /* APP_ADC_H_ */ diff --git a/software/Basic_Blink/app/ads101x.cpp b/software/Basic_Blink/app/ads101x.cpp new file mode 100644 index 0000000..9b2d88a --- /dev/null +++ b/software/Basic_Blink/app/ads101x.cpp @@ -0,0 +1,167 @@ +/* + * ADS101x.cpp + * + * Created on: Jul 20, 2017 + * Author: Elmar + */ + +#include "ads101x.h" +#include + +namespace rijnfel { + +namespace ads { + +static const uint16_t OS_POS = 15; +static const uint16_t OS_MASK = 1 << OS_POS; +static const uint16_t MUX_POS = 12; +static const uint16_t MUX_MASK = 7 << MUX_POS; +static const uint16_t PGA_POS = 9; +static const uint16_t PGA_MASK = 7 << PGA_POS; +static const uint16_t MODE_POS = 8; +static const uint16_t MODE_MASK = 1 << MODE_POS; +static const uint16_t DR_POS = 5; +static const uint16_t DR_MASK = 7 << DR_POS; + +#define OS_BIT(val) ((val << OS_POS) & OS_MASK) +#define MUX_BIT(val) ((val << MUX_POS) & MUX_MASK) +#define PGA_BIT(val) ((val << PGA_POS) & PGA_MASK) +#define MODE_BIT(val) ((val << MODE_POS) & MODE_MASK) +#define DR_BIT(val) ((val << DR_POS) & DR_MASK) + +static const uint8_t REGISTER_CONVERSION = 0; +static const uint8_t REGISTER_CONFIG = 1; +static const uint8_t REGISTER_LOW_TRESHOLD = 2; +static const uint8_t REGISTER_HIGH_TRESHOLD = 2; + +cADS101x::cADS101x(uint8_t i_address) : + m_address(i_address), m_readyPin(0) { + SetDefaults(); +} +cADS101x::cADS101x(uint8_t i_readyPin, uint8_t i_address) : + m_address(i_address), m_readyPin(i_readyPin) { + SetDefaults(); +} + +void cADS101x::SetOneShot(bool i_oneShot) { + m_oneShot = i_oneShot; + WriteSettings(CreateSettings(0)); +} + +void cADS101x::SetGain(enum eGainAmplifier i_gain) { + m_gain = i_gain; + WriteSettings(CreateSettings(0)); +} + +void cADS101x::SetMux(enum eInputMux i_mux) { + m_mux = i_mux; + WriteSettings(CreateSettings(0)); +} + +void cADS101x::SetSampleSpeed(enum eSampleSpeed i_sampleSpeed) { + m_sampleSpeed = i_sampleSpeed; + WriteSettings(CreateSettings(0)); +} + +void cADS101x::WaitSample(void) { + OneShot(); + uint16 readSettings = 0; + do { + readSettings = GetSettings(); + } while (readSettings & OS_MASK != 1); +} + +bool cADS101x::IsReady(void) { + return (GetSettings() & OS_MASK); +} + +uint16_t cADS101x::CreateSettings(uint8_t start) { + return OS_BIT(start) | MUX_BIT(m_mux) | PGA_BIT(m_gain) + | MODE_BIT(m_oneShot) | DR_BIT(m_sampleSpeed); +} + +void cADS101x::WriteSettings(uint16_t i_settings) { + Wire.beginTransmission(m_address); + Wire.write(REGISTER_CONFIG); + Wire.write((uint8_t) (i_settings >> 8)); + Wire.write((uint8_t) (i_settings & 0xFF)); + Wire.endTransmission(); + +} + +void cADS101x::OneShot(void) { + if (m_oneShot) { + uint16_t settings = CreateSettings(1); + WriteSettings(settings); + } +} + +uint16_t cADS101x::GetSettings(void) { + uint16_t settings; + Wire.beginTransmission(m_address); + Wire.write(REGISTER_CONFIG); + Wire.endTransmission(); + Wire.beginTransmission(m_address); + Wire.requestFrom((int) m_address, 2); //16 bits + settings = Wire.read() << 8; + settings |= Wire.read(); + return settings; +} +ads_voltage_t cADS101x::ConvertSample(ads_sample_t & sample) { + //Raw sample is in (parts of) millivolts, go to micro to remove fractions + ads_voltage_t returnType = (sample.rawSample >> 4) * 1000; //Multiply for extra precision + switch (sample.gain) { + case eGainAmplifier::FSR_0_256: + //one lsb is 0.256 mv = 256 uv + returnType *= 256; + break; + case eGainAmplifier::FSR_0_512: + //one lsb is 0.512 mv = 512 uv + returnType *= 512; + break; + case eGainAmplifier::FSR_1_024: + //one lsb is 1.024 mv = 1024 uv + returnType *= 1024; + break; + case eGainAmplifier::FSR_2_048: + //one lsb is 2.048 mv = 2048 uv + returnType *= 2048; + break; + case eGainAmplifier::FSR_4_096: + //one lsb is 4.096 mv = 4096 uv + returnType *= 4096; + break; + case eGainAmplifier::FSR_6_144: + //one lsb is 6.144 mv = 6144 uv + returnType *= 6144; + break; + } + return returnType; +} + +ads_sample_t cADS101x::RawSample(void) { + OneShot(); + ads_sample_t sample; + Wire.beginTransmission(m_address); + Wire.write(REGISTER_CONVERSION); + Wire.endTransmission(); + Wire.beginTransmission(m_address); + Wire.requestFrom((int) m_address, 2); //16 bits + sample.rawSample = Wire.read() << 8; + sample.rawSample |= Wire.read(); + sample.gain = m_gain; + sample.mux = m_mux; + m_latestSample = sample; + return sample; +} + +void cADS101x::SetDefaults(void) { + m_mux = eInputMux::AIN_0_1; + m_gain = eGainAmplifier::FSR_2_048; + m_sampleSpeed = eSampleSpeed::SPS_1600; + m_oneShot = true; +} + +} + +} diff --git a/software/Basic_Blink/app/ads101x.h b/software/Basic_Blink/app/ads101x.h new file mode 100644 index 0000000..0e2d738 --- /dev/null +++ b/software/Basic_Blink/app/ads101x.h @@ -0,0 +1,70 @@ +/* + * ADS101x.h + * + * Created on: Jul 20, 2017 + * Author: Elmar + */ + +#ifndef APP_ADS101X_H_ +#define APP_ADS101X_H_ + +#include +#include "adc.h" + +namespace rijnfel { + +namespace ads { + +//Voltage in uV +typedef int32_t ads_voltage_t; + +enum eInputMux { + AIN_0_1, AIN_0_3, AIN_1_3, AIN_2_3, AIN_0, AIN_1, AIN_2, AIN_3 +}; +enum eGainAmplifier { + FSR_6_144, FSR_4_096, FSR_2_048, FSR_1_024, FSR_0_512, FSR_0_256 +}; +enum eSampleSpeed { + SPS_128, SPS_250, SPS_490, SPS_920, SPS_1600, SPS_2400, SPS_3300 +}; + +struct ads_sample_t { + int16_t rawSample; + enum eInputMux mux; + enum eGainAmplifier gain; +}; + +class cADS101x: cADC { +public: + + cADS101x(uint8_t i_address = 0x48); + cADS101x(uint8_t i_readyPin, uint8_t i_address = 0x48); + + void SetOneShot(bool i_oneShot = true); + void SetGain(enum eGainAmplifier i_gain); + void SetMux(enum eInputMux i_mux); + void SetSampleSpeed(enum eSampleSpeed i_speed); + virtual void WaitSample(void); + virtual bool IsReady(void); + uint16_t GetSettings(void); + + virtual ads_sample_t RawSample(void); + virtual ads_voltage_t ConvertSample(ads_sample_t & sample); + virtual ~cADS101x() { + + } +private: + uint16_t CreateSettings(uint8_t i_startSample); + void WriteSettings(uint16_t i_settings); + void SetDefaults(void); + void OneShot(void); +private: + uint8_t m_address, m_readyPin; + bool m_oneShot; + enum eInputMux m_mux; + enum eGainAmplifier m_gain; + enum eSampleSpeed m_sampleSpeed; +}; +} +} +#endif /* APP_ADS101X_H_ */ diff --git a/software/Basic_Blink/app/application.cpp b/software/Basic_Blink/app/application.cpp new file mode 100644 index 0000000..6413cc8 --- /dev/null +++ b/software/Basic_Blink/app/application.cpp @@ -0,0 +1,66 @@ +#include +#include +#include +#include "ads101x.h" + +#define LED_PIN 2 // GPIO2 + +using namespace rijnfel; +Timer procTimer; +ads::cADS101x adc; +bool state = true; +uint16_t sampless = 1; +uint8_t channel = 0; +unsigned int average[4]; + +void readAdc() { + //while (adc.IsReady()) { + adc.SetMux(static_cast(ads::eInputMux::AIN_0 + channel)); + channel++; + if (channel > 3) { + channel = 0; + } + uint16_t settings = adc.GetSettings(); + Serial.printf("Settings = %d;\n\r", settings); + + if (false) { + adc.SetMux( + static_cast(ads::eInputMux::AIN_0 + channel)); + ads::ads_sample_t sample = adc.RawSample(); + average[channel] += adc.ConvertSample(sample) / 1000; //want it in mv + channel++; + if (channel > 3) { + channel = 0; + sampless++; + if (sampless > 3300) { + for (uint8_t i = 0; i < 4; i++) { + Serial.printf("C[%d] = %d; ", i, average[i] / sampless); + average[i] = 0; + } + Serial.printf("\n\r"); + sampless = 0; + } + } + } + WDT.alive(); + //} + //Serial.printf("Not ready anymore\n\r"); +} + +void blink() { + readAdc(); +} + +void init() { + Serial.begin(460800); + Wire.pins(5, 4); + + Wire.begin(); + //SET higher CPU freq & disable wifi sleep + system_update_cpu_freq(SYS_CPU_160MHZ); + WDT.enable(false); + pinMode(LED_PIN, OUTPUT); + adc.SetMux(ads::eInputMux::AIN_0); + adc.SetSampleSpeed(ads::eSampleSpeed::SPS_3300); + procTimer.initializeMs(500, readAdc).start(); +} diff --git a/software/Basic_Blink/app/double_buffer.h b/software/Basic_Blink/app/double_buffer.h new file mode 100644 index 0000000..ffa1d06 --- /dev/null +++ b/software/Basic_Blink/app/double_buffer.h @@ -0,0 +1,60 @@ +/* + * double_buffer.h + * + * Created on: Aug 1, 2017 + * Author: Elmar + */ + +#ifndef APP_DOUBLE_BUFFER_H_ +#define APP_DOUBLE_BUFFER_H_ + +#include + +namespace rijnfel { + +template +class cDoubleBuffer { +public: + cDoubleBuffer(int i_size) : + m_size(i_size) { + m_writeIndex = 0; + m_bufferIndex = 0; + m_buf = new BufferType*[2]; + m_buf[0] = new BufferType[m_size]; + m_buf[1] = new BufferType[m_size]; + } + + void Resize(int i_newSize) { + + } + + bool AddValue(BufferType i_val) { + m_buf[m_bufferIndex][m_writeIndex] = i_val; + m_writeIndex++; + if (m_writeIndex >= m_size) { + m_bufferIndex = !m_bufferIndex; + m_writeIndex = 0; + return true; + } + return false; + } + + BufferType * GetBuffer(int i_index) { + return m_buf[i_index]; + } + + virtual ~cDoubleBuffer() { + delete m_buf[0]; + delete m_buf[1]; + delete m_buf; + } +private: + int m_size; + int m_writeIndex; + int m_bufferIndex; + BufferType ** m_buf; +}; + +} /* namespace rijnfel */ + +#endif /* APP_DOUBLE_BUFFER_H_ */ diff --git a/software/Basic_Blink/app/sensor.h b/software/Basic_Blink/app/sensor.h new file mode 100644 index 0000000..09defb7 --- /dev/null +++ b/software/Basic_Blink/app/sensor.h @@ -0,0 +1,38 @@ +/* + * sensor.h + * + * Created on: Aug 1, 2017 + * Author: Elmar + */ + +#ifndef APP_SENSOR_H_ +#define APP_SENSOR_H_ + +#include + +namespace rijnfel { +template +class cSensor { +public: + cSensor() { + m_callback = NULL; + } + Sample GetLatestSample(void) { + return m_latestSample; + } + void SetOnSampleCallBack(void (*i_callback)(Sample & o_sample)) { + m_callback = i_callback; + } + virtual void WaitSample(void) = 0; + virtual bool IsReady(void) = 0; + virtual Sample RawSample(void) = 0; + virtual ~cSensor() { + + } +protected: + Sample m_latestSample; + void (*m_callback)(Sample & o_sample); +}; +} + +#endif /* APP_SENSOR_H_ */ diff --git a/software/Basic_Blink/app/sensor_hub.cpp b/software/Basic_Blink/app/sensor_hub.cpp new file mode 100644 index 0000000..9adce3d --- /dev/null +++ b/software/Basic_Blink/app/sensor_hub.cpp @@ -0,0 +1,47 @@ +/* + * sensor_hub.cpp + * + * Created on: Aug 1, 2017 + * Author: Elmar + */ + +#include "sensor_hub.h" +#include + +namespace rijnfel { + +cSensorHub::cSensorHub(uint32_t i_updatePeriod) : + m_updatePeriod(i_updatePeriod) { + m_adc = new ads::cADS101x(); + m_adcSettings = NULL; + m_tempSettings = NULL; +} + +void cSensorHub::Update() { + if (m_adcSettings) { + if (m_adcSettings->ShouldSample(m_updatePeriod)) { + if (m_adcSettings->m_buffer.AddValue(m_adc->RawSample())) { + m_adcSettings->m_callback(m_adcSettings->m_buffer); + } + } + } +} + +void cSensorHub::SetAdcSettings( + cSensorSettings * i_adcSettings) { + m_adcSettings = i_adcSettings; +} + +void cSensorHub::SetTempSettings(cSensorSettings * i_tempSettings) { + m_tempSettings = i_tempSettings; +} + +cSensorHub::~cSensorHub() { + if (m_adcSettings) + delete m_adcSettings; + if (m_tempSettings) + delete m_tempSettings; + delete m_adc; +} + +} /* namespace rijnfel */ diff --git a/software/Basic_Blink/app/sensor_hub.h b/software/Basic_Blink/app/sensor_hub.h new file mode 100644 index 0000000..be91fc4 --- /dev/null +++ b/software/Basic_Blink/app/sensor_hub.h @@ -0,0 +1,33 @@ +/* + * sensor_hub.h + * + * Created on: Aug 1, 2017 + * Author: Elmar + */ + +#ifndef APP_SENSOR_HUB_H_ +#define APP_SENSOR_HUB_H_ + +#include "ads101x.h" +#include "sensor_settings.h" + +namespace rijnfel { + +class cSensorHub { +public: + //in milliseconds + cSensorHub(uint32_t i_updatePeriod); + void SetAdcSettings(cSensorSettings * i_adcSettings); + void SetTempSettings(cSensorSettings * i_tempSettings); + void Update(); + virtual ~cSensorHub(); +private: + uint32_t m_updatePeriod; + cSensorSettings * m_adcSettings; + cSensorSettings * m_tempSettings; + ads::cADS101x * m_adc; +}; + +} /* namespace rijnfel */ + +#endif /* APP_SENSOR_HUB_H_ */ diff --git a/software/Basic_Blink/app/sensor_settings.h b/software/Basic_Blink/app/sensor_settings.h new file mode 100644 index 0000000..5abc6e0 --- /dev/null +++ b/software/Basic_Blink/app/sensor_settings.h @@ -0,0 +1,41 @@ +/* + * sensor_settings.h + * + * Created on: Aug 1, 2017 + * Author: Elmar + */ + +#ifndef APP_SENSOR_SETTINGS_H_ +#define APP_SENSOR_SETTINGS_H_ + +#include "double_buffer.h" + +namespace rijnfel { + +template +class cSensorSettings { +public: + cSensorSettings(void (*i_callback)(cDoubleBuffer & buffer), + uint32_t i_periodTimer, uint32_t i_period) : + m_callback(i_callback), m_periodTimer(i_periodTimer), m_period( + i_period) { + m_buffer(1000 / m_period); + } + bool ShouldSample(uint32_t i_updatePeriod) { + m_periodTimer += i_updatePeriod; + if (m_periodTimer >= m_period) { + m_periodTimer -= m_period; + return true; + } + return false; + } + cDoubleBuffer m_buffer; + void (*m_callback)(cDoubleBuffer & buffer); +private: + uint32_t m_periodTimer; + uint32_t m_period; +}; + +} + +#endif /* APP_SENSOR_SETTINGS_H_ */ diff --git a/software/Basic_Blink/app/temperature.h b/software/Basic_Blink/app/temperature.h new file mode 100644 index 0000000..1d354e9 --- /dev/null +++ b/software/Basic_Blink/app/temperature.h @@ -0,0 +1,28 @@ +/* + * temperature.h + * + * Created on: Aug 1, 2017 + * Author: Elmar + */ + +#ifndef APP_TEMPERATURE_H_ +#define APP_TEMPERATURE_H_ + +#include "sensor.h" + +namespace rijnfel { +template +class cTemperatureSensor: cSensor { +public: + cTemperatureSensor() { + + } + virtual Temperature ConvertSample(Sample sample) = 0; + virtual ~cTemperatureSensor() { + + } +}; + +} + +#endif /* APP_TEMPERATURE_H_ */ diff --git a/software/Basic_Blink/include/user_config.h b/software/Basic_Blink/include/user_config.h new file mode 100644 index 0000000..09825be --- /dev/null +++ b/software/Basic_Blink/include/user_config.h @@ -0,0 +1,45 @@ +#ifndef __USER_CONFIG_H__ +#define __USER_CONFIG_H__ + +#ifdef __cplusplus +extern "C" { +#endif + + // UART config + #define SERIAL_BAUD_RATE COM_SPEED_SERIAL + + // ESP SDK config + #define LWIP_OPEN_SRC + #define USE_US_TIMER + + // Default types + #define __CORRECT_ISO_CPP_STDLIB_H_PROTO + #include + #include + + // Override c_types.h include and remove buggy espconn + #define _C_TYPES_H_ + #define _NO_ESPCON_ + + // Updated, compatible version of c_types.h + // Just removed types declared in + #include + + // System API declarations + #include + + // C++ Support + #include + // Extended string conversion for compatibility + #include + // Network base API + #include + + // Beta boards + #define BOARD_ESP01 + +#ifdef __cplusplus +} +#endif + +#endif