Changeset - b61e1f4d75c5
[Not reviewed]
default
0 19 0
Ethan Zonca - 6 years ago 2018-12-29 17:49:48
ez@ethanzonca.com
Fix indentation/formatting
19 files changed with 763 insertions and 762 deletions:
0 comments (0 inline, 0 general)
.cproject
Show inline comments
 
@@ -14,7 +14,7 @@
 
				</extensions>
 
			</storageModule>
 
			<storageModule moduleId="cdtBuildSystem" version="4.0.0">
 
				<configuration artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.debug" cleanCommand="${cross_rm} -rf" description="" id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.1538442532" name="Debug" optionalBuildProperties="org.eclipse.cdt.docker.launcher.containerbuild.property.volumes=,org.eclipse.cdt.docker.launcher.containerbuild.property.selectedvolumes=" parent="ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug">
 
				<configuration artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.debug" cleanCommand="${cross_rm} -rf" description="" id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.1538442532" name="Debug" optionalBuildProperties="org.eclipse.cdt.docker.launcher.containerbuild.property.selectedvolumes=,org.eclipse.cdt.docker.launcher.containerbuild.property.volumes=" parent="ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug">
 
					<folderInfo id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.1538442532." name="/" resourcePath="">
 
						<toolChain id="ilg.gnuarmeclipse.managedbuild.cross.toolchain.elf.debug.1849706153" name="Cross ARM GCC" superClass="ilg.gnuarmeclipse.managedbuild.cross.toolchain.elf.debug">
 
							<option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level.1898847267" name="Optimization Level" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level" useByScannerDiscovery="true" value="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level.size" valueType="enumerated"/>
 
@@ -477,4 +477,5 @@
 
		</scannerConfigBuildInfo>
 
	</storageModule>
 
	<storageModule moduleId="org.eclipse.cdt.make.core.buildtargets"/>
 
	<storageModule moduleId="org.eclipse.cdt.internal.ui.text.commentOwnerProjectMappings"/>
 
</cproject>
inc/system/error.h
Show inline comments
 
@@ -5,10 +5,10 @@
 
// If adding errors, remember to define a message for each in error.c
 
enum error_number
 
{
 
	ERR_INFO = 0,
 
	ERR_GENERIC,
 
	ERR_PERIPHINIT,
 
	ERR_COMMANDTIMEOUT,
 
    ERR_INFO = 0,
 
    ERR_GENERIC,
 
    ERR_PERIPHINIT,
 
    ERR_COMMANDTIMEOUT,
 
};
 
 
void error_assert(const uint8_t errno);
lib/max31856/max31856.c
Show inline comments
 
@@ -25,64 +25,64 @@ static void __read_reg(uint8_t reg, uint
 
// Initialize the MAX31856 driver
 
void max31856_init(SPI_HandleTypeDef* spi_port, GPIO_TypeDef* cs_port, uint32_t cs_pin, uint32_t sensor_type)
 
{
 
	// Set CS pin references
 
	csport = cs_port;
 
	cspin = cs_pin;
 
    // Set CS pin references
 
    csport = cs_port;
 
    cspin = cs_pin;
 

	
 
	// Set SPI port reference
 
	spiport = spi_port;
 
    // Set SPI port reference
 
    spiport = spi_port;
 

	
 
	// Configure the CS pin for output
 
	GPIO_InitTypeDef GPIO_InitStruct;
 
	GPIO_InitStruct.Pin = cs_pin;
 
	GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
 
	GPIO_InitStruct.Pull = GPIO_NOPULL;
 
	GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
 
	HAL_GPIO_Init(cs_port, &GPIO_InitStruct);
 
    // Configure the CS pin for output
 
    GPIO_InitTypeDef GPIO_InitStruct;
 
    GPIO_InitStruct.Pin = cs_pin;
 
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
 
    GPIO_InitStruct.Pull = GPIO_NOPULL;
 
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
 
    HAL_GPIO_Init(cs_port, &GPIO_InitStruct);
 

	
 
	// MAX31856
 
	// - set to continuous conversion mode
 
	// - probably no filtering, we'll do that on this side of things
 
	// - set up to read the typical open/short faults but not the high/low alarms
 
    // MAX31856
 
    // - set to continuous conversion mode
 
    // - probably no filtering, we'll do that on this side of things
 
    // - set up to read the typical open/short faults but not the high/low alarms
 

	
 

	
 
	// TODO: Enable open/short detection
 
	// Enables auto conv
 
	__write_reg(MAX31856_CR0_REG, MAX31856_CR0_AUTOCONVERT); //  MAX31856_CR0_OCFAULT0
 
    // TODO: Enable open/short detection
 
    // Enables auto conv
 
    __write_reg(MAX31856_CR0_REG, MAX31856_CR0_AUTOCONVERT); //  MAX31856_CR0_OCFAULT0
 

	
 
	// Averaging set to 1 sample, TC type set to K
 
	__write_reg(MAX31856_CR1_REG, MAX31856_TCTYPE_K);
 
    // Averaging set to 1 sample, TC type set to K
 
    __write_reg(MAX31856_CR1_REG, MAX31856_TCTYPE_K);
 

	
 
	// sensor type - could we just mask bits off? maybe optimize the enum for this
 
    // sensor type - could we just mask bits off? maybe optimize the enum for this
 
}
 

	
 

	
 
// Pull reading from the MAX31856 IC
 
float max31856_process(void)
 
{
 
	uint8_t tempbuf[3];
 
	__read_reg(MAX31856_LTCBH_REG, tempbuf, 3);
 
    uint8_t tempbuf[3];
 
    __read_reg(MAX31856_LTCBH_REG, tempbuf, 3);
 

	
 

	
 
	volatile int32_t temp24 = tempbuf[0] << 16 | tempbuf[1] << 8 | tempbuf[2];
 
	if (temp24 & 0x800000) {
 
		temp24 |= 0xFF000000;  // fix sign
 
	}
 
    volatile int32_t temp24 = tempbuf[0] << 16 | tempbuf[1] << 8 | tempbuf[2];
 
    if (temp24 & 0x800000) {
 
        temp24 |= 0xFF000000;  // fix sign
 
    }
 

	
 
	temp24 >>= 5;  // bottom 5 bits are unused
 
    temp24 >>= 5;  // bottom 5 bits are unused
 

	
 
	float tempfloat = temp24;
 
	tempfloat *= 0.0078125;
 
    float tempfloat = temp24;
 
    tempfloat *= 0.0078125;
 

	
 
	temp_latest = tempfloat;
 
	return tempfloat;
 
    temp_latest = tempfloat;
 
    return tempfloat;
 

	
 

	
 

	
 

	
 
	// Read temperature from the MAX31856 (approx 10hz optimally)
 
//	uint8_t data[] = {0,0,0,0};
 
//	HAL_SPI_Transmit(spiport, data, 1, 100);
 
    // Read temperature from the MAX31856 (approx 10hz optimally)
 
    //	uint8_t data[] = {0,0,0,0};
 
    //	HAL_SPI_Transmit(spiport, data, 1, 100);
 

	
 
}
 

	
 
@@ -90,66 +90,66 @@ float max31856_process(void)
 
// Return latest temperature reading (unaveraged, deg C)
 
float max31856_latest_temp(void)
 
{
 
	return temp_latest;
 
    return temp_latest;
 
}
 

	
 

	
 
// Return average temperature reading (deg C)
 
float max31856_avg_temp(void)
 
{
 
	return temp_latest;
 
    return temp_latest;
 
}
 

	
 

	
 
static void __write_reg(uint8_t reg, uint8_t data)
 
{
 
	// Set write bit
 
	reg |= MAX31856_WRITE_BIT;
 
    // Set write bit
 
    reg |= MAX31856_WRITE_BIT;
 

	
 
	uint8_t outarr[2] = {reg, data};
 
	uint8_t dummyrx[2];
 
    uint8_t outarr[2] = {reg, data};
 
    uint8_t dummyrx[2];
 

	
 
	// Assert the bus
 
	__cs_assert();
 
    // Assert the bus
 
    __cs_assert();
 

	
 

	
 
	// Write data
 
	volatile HAL_StatusTypeDef res = HAL_SPI_TransmitReceive(spiport, outarr, dummyrx, 2, 100);
 
    // Write data
 
    volatile HAL_StatusTypeDef res = HAL_SPI_TransmitReceive(spiport, outarr, dummyrx, 2, 100);
 

	
 

	
 
	// Release the bus
 
	__cs_deassert();
 
    // Release the bus
 
    __cs_deassert();
 
}
 

	
 
static void __read_reg(uint8_t reg, uint8_t* rxbuf, uint8_t len)
 
{
 
	// Transmit buffer only uses first item for reg addr
 
	uint8_t regarr[1];
 
	regarr[0] = reg;
 
    // Transmit buffer only uses first item for reg addr
 
    uint8_t regarr[1];
 
    regarr[0] = reg;
 

	
 
	uint8_t dummyrx[12] = {0};
 
	uint8_t dummytx[12] = {0};
 
    uint8_t dummyrx[12] = {0};
 
    uint8_t dummytx[12] = {0};
 

	
 
	// Assert the bus
 
	__cs_assert();
 
    // Assert the bus
 
    __cs_assert();
 

	
 
	// Send address
 
	HAL_SPI_TransmitReceive(spiport, regarr, dummyrx, 1, 100);
 
    // Send address
 
    HAL_SPI_TransmitReceive(spiport, regarr, dummyrx, 1, 100);
 

	
 
	// Receive data
 
	HAL_SPI_TransmitReceive(spiport, dummytx, rxbuf, len, 100);
 
    // Receive data
 
    HAL_SPI_TransmitReceive(spiport, dummytx, rxbuf, len, 100);
 

	
 
	// Release bus
 
	__cs_deassert();
 
    // Release bus
 
    __cs_deassert();
 

	
 
}
 

	
 
static void __cs_assert(void)
 
{
 
	HAL_GPIO_WritePin(csport, cspin, 0);
 
    HAL_GPIO_WritePin(csport, cspin, 0);
 
}
 

	
 
static void __cs_deassert(void)
 
{
 
	HAL_GPIO_WritePin(csport, cspin, 1);
 
    HAL_GPIO_WritePin(csport, cspin, 1);
 
}
lib/max31856/max31856.h
Show inline comments
 
@@ -48,16 +48,16 @@ float max31856_avg_temp(void);
 

	
 
typedef enum
 
{
 
  MAX31856_TCTYPE_B  = 0b0000,
 
  MAX31856_TCTYPE_E  = 0b0001,
 
  MAX31856_TCTYPE_J  = 0b0010,
 
  MAX31856_TCTYPE_K  = 0b0011,
 
  MAX31856_TCTYPE_N  = 0b0100,
 
  MAX31856_TCTYPE_R  = 0b0101,
 
  MAX31856_TCTYPE_S  = 0b0110,
 
  MAX31856_TCTYPE_T  = 0b0111,
 
  MAX31856_VMODE_G8  = 0b1000,
 
  MAX31856_VMODE_G32 = 0b1100,
 
    MAX31856_TCTYPE_B  = 0b0000,
 
    MAX31856_TCTYPE_E  = 0b0001,
 
    MAX31856_TCTYPE_J  = 0b0010,
 
    MAX31856_TCTYPE_K  = 0b0011,
 
    MAX31856_TCTYPE_N  = 0b0100,
 
    MAX31856_TCTYPE_R  = 0b0101,
 
    MAX31856_TCTYPE_S  = 0b0110,
 
    MAX31856_TCTYPE_T  = 0b0111,
 
    MAX31856_VMODE_G8  = 0b1000,
 
    MAX31856_VMODE_G32 = 0b1100,
 
} max31856_thermocoupletype_t;
 

	
 

	
lib/ssd1306/ssd1306.c
Show inline comments
 
@@ -20,219 +20,219 @@ static void setStartColumn(unsigned char
 
// Initialize OLED
 
void ssd1306_init(void)
 
{
 
	__SPI3_CLK_ENABLE();
 
	__GPIOA_CLK_ENABLE();
 
	__GPIOB_CLK_ENABLE();
 
	GPIO_InitTypeDef GPIO_InitStruct;
 
    __SPI3_CLK_ENABLE();
 
    __GPIOA_CLK_ENABLE();
 
    __GPIOB_CLK_ENABLE();
 
    GPIO_InitTypeDef GPIO_InitStruct;
 
 
	// GPIO
 
	GPIO_InitStruct.Pin = OLED_CS_Pin|OLED_RESET_Pin|OLED_DC_Pin;
 
	GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
 
	GPIO_InitStruct.Pull = GPIO_NOPULL;
 
	GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
 
	HAL_GPIO_Init(OLED_DC_GPIO_Port, &GPIO_InitStruct);
 
    // GPIO
 
    GPIO_InitStruct.Pin = OLED_CS_Pin|OLED_RESET_Pin|OLED_DC_Pin;
 
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
 
    GPIO_InitStruct.Pull = GPIO_NOPULL;
 
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
 
    HAL_GPIO_Init(OLED_DC_GPIO_Port, &GPIO_InitStruct);
 
 
 
	// Set up MOSI/MISO/SCK
 
	GPIO_InitStruct.Pin = GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5;
 
	GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
 
	GPIO_InitStruct.Pull = GPIO_NOPULL;
 
	GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
 
	GPIO_InitStruct.Alternate = GPIO_AF6_SPI3;
 
	HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
 
    // Set up MOSI/MISO/SCK
 
    GPIO_InitStruct.Pin = GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5;
 
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
 
    GPIO_InitStruct.Pull = GPIO_NOPULL;
 
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
 
    GPIO_InitStruct.Alternate = GPIO_AF6_SPI3;
 
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
 
 
 
	// Set up SPI port for OLED
 
	hspi1.Instance = SPI3;
 
	hspi1.Init.Mode = SPI_MODE_MASTER;
 
	hspi1.Init.Direction = SPI_DIRECTION_2LINES;
 
	hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
 
	hspi1.Init.CLKPolarity = SPI_POLARITY_HIGH;
 
	hspi1.Init.CLKPhase = SPI_PHASE_2EDGE;
 
	hspi1.Init.NSS = SPI_NSS_SOFT;
 
	hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16;
 
	hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
 
	hspi1.Init.TIMode = SPI_TIMODE_DISABLED;
 
	hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLED;
 
	hspi1.Init.NSSPMode = SPI_NSS_PULSE_DISABLED;
 
	HAL_SPI_Init(&hspi1);
 
    // Set up SPI port for OLED
 
    hspi1.Instance = SPI3;
 
    hspi1.Init.Mode = SPI_MODE_MASTER;
 
    hspi1.Init.Direction = SPI_DIRECTION_2LINES;
 
    hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
 
    hspi1.Init.CLKPolarity = SPI_POLARITY_HIGH;
 
    hspi1.Init.CLKPhase = SPI_PHASE_2EDGE;
 
    hspi1.Init.NSS = SPI_NSS_SOFT;
 
    hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16;
 
    hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
 
    hspi1.Init.TIMode = SPI_TIMODE_DISABLED;
 
    hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLED;
 
    hspi1.Init.NSSPMode = SPI_NSS_PULSE_DISABLED;
 
    HAL_SPI_Init(&hspi1);
 
 
 
	// Generate a reset
 
	SSD_Reset_Low();
 
	uint32_t i;
 
	for(i=5000; i>1; i--)
 
	SSD_Reset_High();
 
    // Generate a reset
 
    SSD_Reset_Low();
 
    uint32_t i;
 
    for(i=5000; i>1; i--)
 
        SSD_Reset_High();
 
 
	WriteCommand(0xAE);
 
	WriteCommand(0xD5);
 
	WriteCommand(0x80);
 
	WriteCommand(0xA8);
 
	WriteCommand(0x1F);
 
	WriteCommand(0xD3);
 
	WriteCommand(0x00);
 
	WriteCommand(0x40 | 0x00); // line #0
 
	WriteCommand(0x8D);
 
	WriteCommand(0x14); //10 or 14 if not externalvcc
 
	WriteCommand(0x20);
 
	WriteCommand(0x00);
 
	//  WriteCommand(0xA0 | 0x1); // segremap (normal)
 
	WriteCommand(0xA0); // segremap (flip)
 
	//  WriteCommand(0xC8); // comscandec (normal)
 
	WriteCommand(0xC0); // comscandec (flip)
 
	WriteCommand(0xDA); // setcompins
 
	WriteCommand(0x02);
 
	WriteCommand(0x81); // contrast
 
	WriteCommand(0x0F); // contrast value. 8f is a good one.
 
	WriteCommand(0xD9);
 
	WriteCommand(0xF1); //22 or F1 if not externalvcc
 
	WriteCommand(0xDB);
 
	WriteCommand(0x40);
 
	WriteCommand(0xA4); // dispalyallon_resume
 
	WriteCommand(0xA6); // normaldisplay
 
    WriteCommand(0xAE);
 
    WriteCommand(0xD5);
 
    WriteCommand(0x80);
 
    WriteCommand(0xA8);
 
    WriteCommand(0x1F);
 
    WriteCommand(0xD3);
 
    WriteCommand(0x00);
 
    WriteCommand(0x40 | 0x00); // line #0
 
    WriteCommand(0x8D);
 
    WriteCommand(0x14); //10 or 14 if not externalvcc
 
    WriteCommand(0x20);
 
    WriteCommand(0x00);
 
    //  WriteCommand(0xA0 | 0x1); // segremap (normal)
 
    WriteCommand(0xA0); // segremap (flip)
 
    //  WriteCommand(0xC8); // comscandec (normal)
 
    WriteCommand(0xC0); // comscandec (flip)
 
    WriteCommand(0xDA); // setcompins
 
    WriteCommand(0x02);
 
    WriteCommand(0x81); // contrast
 
    WriteCommand(0x0F); // contrast value. 8f is a good one.
 
    WriteCommand(0xD9);
 
    WriteCommand(0xF1); //22 or F1 if not externalvcc
 
    WriteCommand(0xDB);
 
    WriteCommand(0x40);
 
    WriteCommand(0xA4); // dispalyallon_resume
 
    WriteCommand(0xA6); // normaldisplay
 
 
 
	WriteCommand(0xAF); // display on
 
    WriteCommand(0xAF); // display on
 
}
 
 
 
// Times New Roman font
 
static const char fontData[][5] =
 
{                                       // Refer to "Times New Roman" Font Database
 
                                        //   Basic Characters
 
    {0x00,0x00,0x00,0x00,0x00},         //   (  0)    - 0x0020 No-Break Space
 
    {0x00,0x00,0x4F,0x00,0x00},         //   (  1)  ! - 0x0021 Exclamation Mark
 
    {0x00,0x07,0x00,0x07,0x00},         //   (  2)  " - 0x0022 Quotation Mark
 
    {0x14,0x7F,0x14,0x7F,0x14},         //   (  3)  # - 0x0023 Number Sign
 
    {0x24,0x2A,0x7F,0x2A,0x12},         //   (  4)  $ - 0x0024 Dollar Sign
 
    {0x23,0x13,0x08,0x64,0x62},         //   (  5)  % - 0x0025 Percent Sign
 
    {0x36,0x49,0x55,0x22,0x50},         //   (  6)  & - 0x0026 Ampersand
 
    {0x00,0x05,0x03,0x00,0x00},         //   (  7)  ' - 0x0027 Apostrophe
 
    {0x00,0x1C,0x22,0x41,0x00},         //   (  8)  ( - 0x0028 Left Parenthesis
 
    {0x00,0x41,0x22,0x1C,0x00},         //   (  9)  ) - 0x0029 Right Parenthesis
 
    {0x14,0x08,0x3E,0x08,0x14},         //   ( 10)  * - 0x002A Asterisk
 
    {0x08,0x08,0x3E,0x08,0x08},         //   ( 11)  + - 0x002B Plus Sign
 
    {0x00,0x50,0x30,0x00,0x00},         //   ( 12)  , - 0x002C Comma
 
    {0x08,0x08,0x08,0x08,0x08},         //   ( 13)  - - 0x002D Hyphen-Minus
 
    {0x00,0x60,0x60,0x00,0x00},         //   ( 14)  . - 0x002E Full Stop
 
    {0x20,0x10,0x08,0x04,0x02},         //   ( 15)  / - 0x002F Solidus
 
    {0x3E,0x51,0x49,0x45,0x3E},         //   ( 16)  0 - 0x0030 Digit Zero
 
    {0x00,0x42,0x7F,0x40,0x00},         //   ( 17)  1 - 0x0031 Digit One
 
    {0x42,0x61,0x51,0x49,0x46},         //   ( 18)  2 - 0x0032 Digit Two
 
    {0x21,0x41,0x45,0x4B,0x31},         //   ( 19)  3 - 0x0033 Digit Three
 
    {0x18,0x14,0x12,0x7F,0x10},         //   ( 20)  4 - 0x0034 Digit Four
 
    {0x27,0x45,0x45,0x45,0x39},         //   ( 21)  5 - 0x0035 Digit Five
 
    {0x3C,0x4A,0x49,0x49,0x30},         //   ( 22)  6 - 0x0036 Digit Six
 
    {0x01,0x71,0x09,0x05,0x03},         //   ( 23)  7 - 0x0037 Digit Seven
 
    {0x36,0x49,0x49,0x49,0x36},         //   ( 24)  8 - 0x0038 Digit Eight
 
    {0x06,0x49,0x49,0x29,0x1E},         //   ( 25)  9 - 0x0039 Dight Nine
 
    {0x00,0x36,0x36,0x00,0x00},         //   ( 26)  : - 0x003A Colon
 
    {0x00,0x56,0x36,0x00,0x00},         //   ( 27)  ; - 0x003B Semicolon
 
    {0x08,0x14,0x22,0x41,0x00},         //   ( 28)  < - 0x003C Less-Than Sign
 
    {0x14,0x14,0x14,0x14,0x14},         //   ( 29)  = - 0x003D Equals Sign
 
    {0x00,0x41,0x22,0x14,0x08},         //   ( 30)  > - 0x003E Greater-Than Sign
 
    {0x02,0x01,0x51,0x09,0x06},         //   ( 31)  ? - 0x003F Question Mark
 
    {0x32,0x49,0x79,0x41,0x3E},         //   ( 32)  @ - 0x0040 Commercial At
 
    {0x7E,0x11,0x11,0x11,0x7E},         //   ( 33)  A - 0x0041 Latin Capital Letter A
 
    {0x7F,0x49,0x49,0x49,0x36},         //   ( 34)  B - 0x0042 Latin Capital Letter B
 
    {0x3E,0x41,0x41,0x41,0x22},         //   ( 35)  C - 0x0043 Latin Capital Letter C
 
    {0x7F,0x41,0x41,0x22,0x1C},         //   ( 36)  D - 0x0044 Latin Capital Letter D
 
    {0x7F,0x49,0x49,0x49,0x41},         //   ( 37)  E - 0x0045 Latin Capital Letter E
 
    {0x7F,0x09,0x09,0x09,0x01},         //   ( 38)  F - 0x0046 Latin Capital Letter F
 
    {0x3E,0x41,0x49,0x49,0x7A},         //   ( 39)  G - 0x0047 Latin Capital Letter G
 
    {0x7F,0x08,0x08,0x08,0x7F},         //   ( 40)  H - 0x0048 Latin Capital Letter H
 
    {0x00,0x41,0x7F,0x41,0x00},         //   ( 41)  I - 0x0049 Latin Capital Letter I
 
    {0x20,0x40,0x41,0x3F,0x01},         //   ( 42)  J - 0x004A Latin Capital Letter J
 
    {0x7F,0x08,0x14,0x22,0x41},         //   ( 43)  K - 0x004B Latin Capital Letter K
 
    {0x7F,0x40,0x40,0x40,0x40},         //   ( 44)  L - 0x004C Latin Capital Letter L
 
    {0x7F,0x02,0x0C,0x02,0x7F},         //   ( 45)  M - 0x004D Latin Capital Letter M
 
    {0x7F,0x04,0x08,0x10,0x7F},         //   ( 46)  N - 0x004E Latin Capital Letter N
 
    {0x3E,0x41,0x41,0x41,0x3E},         //   ( 47)  O - 0x004F Latin Capital Letter O
 
    {0x7F,0x09,0x09,0x09,0x06},         //   ( 48)  P - 0x0050 Latin Capital Letter P
 
    {0x3E,0x41,0x51,0x21,0x5E},         //   ( 49)  Q - 0x0051 Latin Capital Letter Q
 
    {0x7F,0x09,0x19,0x29,0x46},         //   ( 50)  R - 0x0052 Latin Capital Letter R
 
    {0x46,0x49,0x49,0x49,0x31},         //   ( 51)  S - 0x0053 Latin Capital Letter S
 
    {0x01,0x01,0x7F,0x01,0x01},         //   ( 52)  T - 0x0054 Latin Capital Letter T
 
    {0x3F,0x40,0x40,0x40,0x3F},         //   ( 53)  U - 0x0055 Latin Capital Letter U
 
    {0x1F,0x20,0x40,0x20,0x1F},         //   ( 54)  V - 0x0056 Latin Capital Letter V
 
    {0x3F,0x40,0x38,0x40,0x3F},         //   ( 55)  W - 0x0057 Latin Capital Letter W
 
    {0x63,0x14,0x08,0x14,0x63},         //   ( 56)  X - 0x0058 Latin Capital Letter X
 
    {0x07,0x08,0x70,0x08,0x07},         //   ( 57)  Y - 0x0059 Latin Capital Letter Y
 
    {0x61,0x51,0x49,0x45,0x43},         //   ( 58)  Z - 0x005A Latin Capital Letter Z
 
    {0x00,0x7F,0x41,0x41,0x00},         //   ( 59)  [ - 0x005B Left Square Bracket
 
    {0x02,0x04,0x08,0x10,0x20},         //   ( 60)  \ - 0x005C Reverse Solidus
 
    {0x00,0x41,0x41,0x7F,0x00},         //   ( 61)  ] - 0x005D Right Square Bracket
 
    {0x04,0x02,0x01,0x02,0x04},         //   ( 62)  ^ - 0x005E Circumflex Accent
 
    {0x40,0x40,0x40,0x40,0x40},         //   ( 63)  _ - 0x005F Low Line
 
    {0x01,0x02,0x04,0x00,0x00},         //   ( 64)  ` - 0x0060 Grave Accent
 
    {0x20,0x54,0x54,0x54,0x78},         //   ( 65)  a - 0x0061 Latin Small Letter A
 
    {0x7F,0x48,0x44,0x44,0x38},         //   ( 66)  b - 0x0062 Latin Small Letter B
 
    {0x38,0x44,0x44,0x44,0x20},         //   ( 67)  c - 0x0063 Latin Small Letter C
 
    {0x38,0x44,0x44,0x48,0x7F},         //   ( 68)  d - 0x0064 Latin Small Letter D
 
    {0x38,0x54,0x54,0x54,0x18},         //   ( 69)  e - 0x0065 Latin Small Letter E
 
    {0x08,0x7E,0x09,0x01,0x02},         //   ( 70)  f - 0x0066 Latin Small Letter F
 
    {0x06,0x49,0x49,0x49,0x3F},         //   ( 71)  g - 0x0067 Latin Small Letter G
 
    {0x7F,0x08,0x04,0x04,0x78},         //   ( 72)  h - 0x0068 Latin Small Letter H
 
    {0x00,0x44,0x7D,0x40,0x00},         //   ( 73)  i - 0x0069 Latin Small Letter I
 
    {0x20,0x40,0x44,0x3D,0x00},         //   ( 74)  j - 0x006A Latin Small Letter J
 
    {0x7F,0x10,0x28,0x44,0x00},         //   ( 75)  k - 0x006B Latin Small Letter K
 
    {0x00,0x41,0x7F,0x40,0x00},         //   ( 76)  l - 0x006C Latin Small Letter L
 
    {0x7C,0x04,0x18,0x04,0x7C},         //   ( 77)  m - 0x006D Latin Small Letter M
 
    {0x7C,0x08,0x04,0x04,0x78},         //   ( 78)  n - 0x006E Latin Small Letter N
 
    {0x38,0x44,0x44,0x44,0x38},         //   ( 79)  o - 0x006F Latin Small Letter O
 
    {0x7C,0x14,0x14,0x14,0x08},         //   ( 80)  p - 0x0070 Latin Small Letter P
 
    {0x08,0x14,0x14,0x18,0x7C},         //   ( 81)  q - 0x0071 Latin Small Letter Q
 
    {0x7C,0x08,0x04,0x04,0x08},         //   ( 82)  r - 0x0072 Latin Small Letter R
 
    {0x48,0x54,0x54,0x54,0x20},         //   ( 83)  s - 0x0073 Latin Small Letter S
 
    {0x04,0x3F,0x44,0x40,0x20},         //   ( 84)  t - 0x0074 Latin Small Letter T
 
    {0x3C,0x40,0x40,0x20,0x7C},         //   ( 85)  u - 0x0075 Latin Small Letter U
 
    {0x1C,0x20,0x40,0x20,0x1C},         //   ( 86)  v - 0x0076 Latin Small Letter V
 
    {0x3C,0x40,0x30,0x40,0x3C},         //   ( 87)  w - 0x0077 Latin Small Letter W
 
    {0x44,0x28,0x10,0x28,0x44},         //   ( 88)  x - 0x0078 Latin Small Letter X
 
    {0x0C,0x50,0x50,0x50,0x3C},         //   ( 89)  y - 0x0079 Latin Small Letter Y
 
    {0x44,0x64,0x54,0x4C,0x44},         //   ( 90)  z - 0x007A Latin Small Letter Z
 
    {0x00,0x08,0x36,0x41,0x00},         //   ( 91)  { - 0x007B Left Curly Bracket
 
    {0x00,0x00,0x7F,0x00,0x00},         //   ( 92)  | - 0x007C Vertical Line
 
    {0x00,0x41,0x36,0x08,0x00},         //   ( 93)  } - 0x007D Right Curly Bracket
 
    {0x02,0x01,0x02,0x04,0x02},         //   ( 94)  ~ - 0x007E Tilde
 
	{0x08,0x14,0x2A,0x14,0x22},         //   ( 95) << - 0x00AB Left-Pointing Double Angle Quotation Mark
 
    {0x00,0x02,0x05,0x02,0x00},         //   ( 96)    - 0x00B0 Degree Sign
 
    {0x44,0x44,0x5F,0x44,0x44},         //   ( 97) +- - 0x00B1 Plus-Minus Sign
 
    {0x7E,0x20,0x20,0x10,0x3E},         //   ( 98)  u - 0x00B5 Micro Sign
 
    {0x22,0x14,0x2A,0x14,0x08},         //   ( 99) >> - 0x00BB Right-Pointing Double Angle Quotation Mark
 
    {0x30,0x48,0x45,0x40,0x20},         //   (100)  ? - 0x00BF Inverted Question Mark
 
    {0x22,0x14,0x08,0x14,0x22},         //   (101)  x - 0x00D7 Multiplication Sign
 
    {0x08,0x08,0x2A,0x08,0x08},         //   (102)  + - 0x00F7 Division Sign
 
    {0x18,0x14,0x08,0x14,0x0C},         //   (103)    - 0x221E Infinity
 
    {0x44,0x4A,0x4A,0x51,0x51},         //   (104)  < - 0x2264 Less-Than or Equal to
 
    {0x51,0x51,0x4A,0x4A,0x44},         //   (105)  > - 0x2265 Greater-Than or Equal to
 
    {0x54,0x14,0x64,0x08,0x70},         //   (106)  .: - RF Symbol
 
    {0x70,0x7C,0x72,0x7C,0x70},         //   (107)  ^ - Lock symbol
 
    {0x70,0x5C,0x52,0x54,0x70},         //   (108)  / - Unlock symbol
 
    {0x0C,0x1E,0x3C,0x1E,0x0C},         //   (109)  <3 - Heart Symbol
 
    {0x18,0x22,0xFF,0x12,0x0C},         //   (110)  U - USB Symbol
 
	{0x22,0x5d,0x22,0x00,0x00},			//   (111) ez updown
 
	{0x14,0x3e,0x14,0x00,0x00},         //   (112) ez updown short
 
        //   Basic Characters
 
        {0x00,0x00,0x00,0x00,0x00},         //   (  0)    - 0x0020 No-Break Space
 
        {0x00,0x00,0x4F,0x00,0x00},         //   (  1)  ! - 0x0021 Exclamation Mark
 
        {0x00,0x07,0x00,0x07,0x00},         //   (  2)  " - 0x0022 Quotation Mark
 
        {0x14,0x7F,0x14,0x7F,0x14},         //   (  3)  # - 0x0023 Number Sign
 
        {0x24,0x2A,0x7F,0x2A,0x12},         //   (  4)  $ - 0x0024 Dollar Sign
 
        {0x23,0x13,0x08,0x64,0x62},         //   (  5)  % - 0x0025 Percent Sign
 
        {0x36,0x49,0x55,0x22,0x50},         //   (  6)  & - 0x0026 Ampersand
 
        {0x00,0x05,0x03,0x00,0x00},         //   (  7)  ' - 0x0027 Apostrophe
 
        {0x00,0x1C,0x22,0x41,0x00},         //   (  8)  ( - 0x0028 Left Parenthesis
 
        {0x00,0x41,0x22,0x1C,0x00},         //   (  9)  ) - 0x0029 Right Parenthesis
 
        {0x14,0x08,0x3E,0x08,0x14},         //   ( 10)  * - 0x002A Asterisk
 
        {0x08,0x08,0x3E,0x08,0x08},         //   ( 11)  + - 0x002B Plus Sign
 
        {0x00,0x50,0x30,0x00,0x00},         //   ( 12)  , - 0x002C Comma
 
        {0x08,0x08,0x08,0x08,0x08},         //   ( 13)  - - 0x002D Hyphen-Minus
 
        {0x00,0x60,0x60,0x00,0x00},         //   ( 14)  . - 0x002E Full Stop
 
        {0x20,0x10,0x08,0x04,0x02},         //   ( 15)  / - 0x002F Solidus
 
        {0x3E,0x51,0x49,0x45,0x3E},         //   ( 16)  0 - 0x0030 Digit Zero
 
        {0x00,0x42,0x7F,0x40,0x00},         //   ( 17)  1 - 0x0031 Digit One
 
        {0x42,0x61,0x51,0x49,0x46},         //   ( 18)  2 - 0x0032 Digit Two
 
        {0x21,0x41,0x45,0x4B,0x31},         //   ( 19)  3 - 0x0033 Digit Three
 
        {0x18,0x14,0x12,0x7F,0x10},         //   ( 20)  4 - 0x0034 Digit Four
 
        {0x27,0x45,0x45,0x45,0x39},         //   ( 21)  5 - 0x0035 Digit Five
 
        {0x3C,0x4A,0x49,0x49,0x30},         //   ( 22)  6 - 0x0036 Digit Six
 
        {0x01,0x71,0x09,0x05,0x03},         //   ( 23)  7 - 0x0037 Digit Seven
 
        {0x36,0x49,0x49,0x49,0x36},         //   ( 24)  8 - 0x0038 Digit Eight
 
        {0x06,0x49,0x49,0x29,0x1E},         //   ( 25)  9 - 0x0039 Dight Nine
 
        {0x00,0x36,0x36,0x00,0x00},         //   ( 26)  : - 0x003A Colon
 
        {0x00,0x56,0x36,0x00,0x00},         //   ( 27)  ; - 0x003B Semicolon
 
        {0x08,0x14,0x22,0x41,0x00},         //   ( 28)  < - 0x003C Less-Than Sign
 
        {0x14,0x14,0x14,0x14,0x14},         //   ( 29)  = - 0x003D Equals Sign
 
        {0x00,0x41,0x22,0x14,0x08},         //   ( 30)  > - 0x003E Greater-Than Sign
 
        {0x02,0x01,0x51,0x09,0x06},         //   ( 31)  ? - 0x003F Question Mark
 
        {0x32,0x49,0x79,0x41,0x3E},         //   ( 32)  @ - 0x0040 Commercial At
 
        {0x7E,0x11,0x11,0x11,0x7E},         //   ( 33)  A - 0x0041 Latin Capital Letter A
 
        {0x7F,0x49,0x49,0x49,0x36},         //   ( 34)  B - 0x0042 Latin Capital Letter B
 
        {0x3E,0x41,0x41,0x41,0x22},         //   ( 35)  C - 0x0043 Latin Capital Letter C
 
        {0x7F,0x41,0x41,0x22,0x1C},         //   ( 36)  D - 0x0044 Latin Capital Letter D
 
        {0x7F,0x49,0x49,0x49,0x41},         //   ( 37)  E - 0x0045 Latin Capital Letter E
 
        {0x7F,0x09,0x09,0x09,0x01},         //   ( 38)  F - 0x0046 Latin Capital Letter F
 
        {0x3E,0x41,0x49,0x49,0x7A},         //   ( 39)  G - 0x0047 Latin Capital Letter G
 
        {0x7F,0x08,0x08,0x08,0x7F},         //   ( 40)  H - 0x0048 Latin Capital Letter H
 
        {0x00,0x41,0x7F,0x41,0x00},         //   ( 41)  I - 0x0049 Latin Capital Letter I
 
        {0x20,0x40,0x41,0x3F,0x01},         //   ( 42)  J - 0x004A Latin Capital Letter J
 
        {0x7F,0x08,0x14,0x22,0x41},         //   ( 43)  K - 0x004B Latin Capital Letter K
 
        {0x7F,0x40,0x40,0x40,0x40},         //   ( 44)  L - 0x004C Latin Capital Letter L
 
        {0x7F,0x02,0x0C,0x02,0x7F},         //   ( 45)  M - 0x004D Latin Capital Letter M
 
        {0x7F,0x04,0x08,0x10,0x7F},         //   ( 46)  N - 0x004E Latin Capital Letter N
 
        {0x3E,0x41,0x41,0x41,0x3E},         //   ( 47)  O - 0x004F Latin Capital Letter O
 
        {0x7F,0x09,0x09,0x09,0x06},         //   ( 48)  P - 0x0050 Latin Capital Letter P
 
        {0x3E,0x41,0x51,0x21,0x5E},         //   ( 49)  Q - 0x0051 Latin Capital Letter Q
 
        {0x7F,0x09,0x19,0x29,0x46},         //   ( 50)  R - 0x0052 Latin Capital Letter R
 
        {0x46,0x49,0x49,0x49,0x31},         //   ( 51)  S - 0x0053 Latin Capital Letter S
 
        {0x01,0x01,0x7F,0x01,0x01},         //   ( 52)  T - 0x0054 Latin Capital Letter T
 
        {0x3F,0x40,0x40,0x40,0x3F},         //   ( 53)  U - 0x0055 Latin Capital Letter U
 
        {0x1F,0x20,0x40,0x20,0x1F},         //   ( 54)  V - 0x0056 Latin Capital Letter V
 
        {0x3F,0x40,0x38,0x40,0x3F},         //   ( 55)  W - 0x0057 Latin Capital Letter W
 
        {0x63,0x14,0x08,0x14,0x63},         //   ( 56)  X - 0x0058 Latin Capital Letter X
 
        {0x07,0x08,0x70,0x08,0x07},         //   ( 57)  Y - 0x0059 Latin Capital Letter Y
 
        {0x61,0x51,0x49,0x45,0x43},         //   ( 58)  Z - 0x005A Latin Capital Letter Z
 
        {0x00,0x7F,0x41,0x41,0x00},         //   ( 59)  [ - 0x005B Left Square Bracket
 
        {0x02,0x04,0x08,0x10,0x20},         //   ( 60)  \ - 0x005C Reverse Solidus
 
        {0x00,0x41,0x41,0x7F,0x00},         //   ( 61)  ] - 0x005D Right Square Bracket
 
        {0x04,0x02,0x01,0x02,0x04},         //   ( 62)  ^ - 0x005E Circumflex Accent
 
        {0x40,0x40,0x40,0x40,0x40},         //   ( 63)  _ - 0x005F Low Line
 
        {0x01,0x02,0x04,0x00,0x00},         //   ( 64)  ` - 0x0060 Grave Accent
 
        {0x20,0x54,0x54,0x54,0x78},         //   ( 65)  a - 0x0061 Latin Small Letter A
 
        {0x7F,0x48,0x44,0x44,0x38},         //   ( 66)  b - 0x0062 Latin Small Letter B
 
        {0x38,0x44,0x44,0x44,0x20},         //   ( 67)  c - 0x0063 Latin Small Letter C
 
        {0x38,0x44,0x44,0x48,0x7F},         //   ( 68)  d - 0x0064 Latin Small Letter D
 
        {0x38,0x54,0x54,0x54,0x18},         //   ( 69)  e - 0x0065 Latin Small Letter E
 
        {0x08,0x7E,0x09,0x01,0x02},         //   ( 70)  f - 0x0066 Latin Small Letter F
 
        {0x06,0x49,0x49,0x49,0x3F},         //   ( 71)  g - 0x0067 Latin Small Letter G
 
        {0x7F,0x08,0x04,0x04,0x78},         //   ( 72)  h - 0x0068 Latin Small Letter H
 
        {0x00,0x44,0x7D,0x40,0x00},         //   ( 73)  i - 0x0069 Latin Small Letter I
 
        {0x20,0x40,0x44,0x3D,0x00},         //   ( 74)  j - 0x006A Latin Small Letter J
 
        {0x7F,0x10,0x28,0x44,0x00},         //   ( 75)  k - 0x006B Latin Small Letter K
 
        {0x00,0x41,0x7F,0x40,0x00},         //   ( 76)  l - 0x006C Latin Small Letter L
 
        {0x7C,0x04,0x18,0x04,0x7C},         //   ( 77)  m - 0x006D Latin Small Letter M
 
        {0x7C,0x08,0x04,0x04,0x78},         //   ( 78)  n - 0x006E Latin Small Letter N
 
        {0x38,0x44,0x44,0x44,0x38},         //   ( 79)  o - 0x006F Latin Small Letter O
 
        {0x7C,0x14,0x14,0x14,0x08},         //   ( 80)  p - 0x0070 Latin Small Letter P
 
        {0x08,0x14,0x14,0x18,0x7C},         //   ( 81)  q - 0x0071 Latin Small Letter Q
 
        {0x7C,0x08,0x04,0x04,0x08},         //   ( 82)  r - 0x0072 Latin Small Letter R
 
        {0x48,0x54,0x54,0x54,0x20},         //   ( 83)  s - 0x0073 Latin Small Letter S
 
        {0x04,0x3F,0x44,0x40,0x20},         //   ( 84)  t - 0x0074 Latin Small Letter T
 
        {0x3C,0x40,0x40,0x20,0x7C},         //   ( 85)  u - 0x0075 Latin Small Letter U
 
        {0x1C,0x20,0x40,0x20,0x1C},         //   ( 86)  v - 0x0076 Latin Small Letter V
 
        {0x3C,0x40,0x30,0x40,0x3C},         //   ( 87)  w - 0x0077 Latin Small Letter W
 
        {0x44,0x28,0x10,0x28,0x44},         //   ( 88)  x - 0x0078 Latin Small Letter X
 
        {0x0C,0x50,0x50,0x50,0x3C},         //   ( 89)  y - 0x0079 Latin Small Letter Y
 
        {0x44,0x64,0x54,0x4C,0x44},         //   ( 90)  z - 0x007A Latin Small Letter Z
 
        {0x00,0x08,0x36,0x41,0x00},         //   ( 91)  { - 0x007B Left Curly Bracket
 
        {0x00,0x00,0x7F,0x00,0x00},         //   ( 92)  | - 0x007C Vertical Line
 
        {0x00,0x41,0x36,0x08,0x00},         //   ( 93)  } - 0x007D Right Curly Bracket
 
        {0x02,0x01,0x02,0x04,0x02},         //   ( 94)  ~ - 0x007E Tilde
 
        {0x08,0x14,0x2A,0x14,0x22},         //   ( 95) << - 0x00AB Left-Pointing Double Angle Quotation Mark
 
        {0x00,0x02,0x05,0x02,0x00},         //   ( 96)    - 0x00B0 Degree Sign
 
        {0x44,0x44,0x5F,0x44,0x44},         //   ( 97) +- - 0x00B1 Plus-Minus Sign
 
        {0x7E,0x20,0x20,0x10,0x3E},         //   ( 98)  u - 0x00B5 Micro Sign
 
        {0x22,0x14,0x2A,0x14,0x08},         //   ( 99) >> - 0x00BB Right-Pointing Double Angle Quotation Mark
 
        {0x30,0x48,0x45,0x40,0x20},         //   (100)  ? - 0x00BF Inverted Question Mark
 
        {0x22,0x14,0x08,0x14,0x22},         //   (101)  x - 0x00D7 Multiplication Sign
 
        {0x08,0x08,0x2A,0x08,0x08},         //   (102)  + - 0x00F7 Division Sign
 
        {0x18,0x14,0x08,0x14,0x0C},         //   (103)    - 0x221E Infinity
 
        {0x44,0x4A,0x4A,0x51,0x51},         //   (104)  < - 0x2264 Less-Than or Equal to
 
        {0x51,0x51,0x4A,0x4A,0x44},         //   (105)  > - 0x2265 Greater-Than or Equal to
 
        {0x54,0x14,0x64,0x08,0x70},         //   (106)  .: - RF Symbol
 
        {0x70,0x7C,0x72,0x7C,0x70},         //   (107)  ^ - Lock symbol
 
        {0x70,0x5C,0x52,0x54,0x70},         //   (108)  / - Unlock symbol
 
        {0x0C,0x1E,0x3C,0x1E,0x0C},         //   (109)  <3 - Heart Symbol
 
        {0x18,0x22,0xFF,0x12,0x0C},         //   (110)  U - USB Symbol
 
        {0x22,0x5d,0x22,0x00,0x00},			//   (111) ez updown
 
        {0x14,0x3e,0x14,0x00,0x00},         //   (112) ez updown short
 
};
 
 
 
// Write command to OLED
 
static void WriteCommand(unsigned char command)
 
{
 
  SSD_CS_Low();
 
  SSD_A0_Low();
 
  SPI_SendByte(command);
 
  SSD_CS_High();
 
    SSD_CS_Low();
 
    SSD_A0_Low();
 
    SPI_SendByte(command);
 
    SSD_CS_High();
 
}
 
 
 
// Write data to OLED
 
static void WriteData(unsigned char data)
 
{
 
  SSD_CS_Low();
 
  SSD_A0_High();
 
  SPI_SendByte(data);
 
  SSD_CS_High();
 
    SSD_CS_Low();
 
    SSD_A0_High();
 
    SPI_SendByte(data);
 
    SSD_CS_High();
 
}
 
 
 
@@ -240,7 +240,7 @@ static void WriteData(unsigned char data
 
static void setStartPage(unsigned char d)
 
{
 
    WriteCommand(0xB0|d);       // Set Page Start Address for Page Addressing Mode
 
                                // Default => 0xB0 (0x00)
 
    // Default => 0xB0 (0x00)
 
}
 
 
 
@@ -249,19 +249,19 @@ static void setStartColumn(unsigned char
 
{
 
    WriteCommand(0x00+d%16);    // Set Lower Column Start Address for Page Addressing Mode
 
    WriteCommand(0x10+d/16);    // Set Higher Column Start Address for Page Addressing Mode
 
                                // Default => 0x10
 
    // Default => 0x10
 
}
 
 
// Therm logo
 
const uint8_t row[4][32] = {
 
 
	{0x00,0x00,0x01,0x03,0x07,0x0F,0x1E,0x3C,0x3C,0x7C,0x7C,0x7C,0xFC,0xFF,0xFF,0xFC,0xFC,0xFC,0xFC,0xFF,0x7F,0x7F,0x7F,0x3C,0x3C,0x1C,0x0C,0x06,0x03,0x01,0x00,0x00},
 
        {0x00,0x00,0x01,0x03,0x07,0x0F,0x1E,0x3C,0x3C,0x7C,0x7C,0x7C,0xFC,0xFF,0xFF,0xFC,0xFC,0xFC,0xFC,0xFF,0x7F,0x7F,0x7F,0x3C,0x3C,0x1C,0x0C,0x06,0x03,0x01,0x00,0x00},
 
 
	{0x0F,0x7F,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x3F,0x3F,0x7F,0xFF,0xFF,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x7F,0x0F},
 
        {0x0F,0x7F,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x3F,0x3F,0x7F,0xFF,0xFF,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x7F,0x0F},
 
 
	{0xF0,0xFE,0xFF,0xFF,0xFF,0xC7,0x00,0x00,0x00,0x00,0x87,0xC7,0xC7,0xFF,0xFF,0x00,0x00,0x00,0x00,0x87,0x87,0xC7,0xC3,0x03,0x07,0x07,0x0F,0x7F,0xFF,0xFF,0xFE,0xF0},
 
        {0xF0,0xFE,0xFF,0xFF,0xFF,0xC7,0x00,0x00,0x00,0x00,0x87,0xC7,0xC7,0xFF,0xFF,0x00,0x00,0x00,0x00,0x87,0x87,0xC7,0xC3,0x03,0x07,0x07,0x0F,0x7F,0xFF,0xFF,0xFE,0xF0},
 
 
	{0x00,0x00,0x80,0xC0,0xE0,0xF0,0xF8,0xFC,0xFC,0xFE,0xFE,0xFE,0xFF,0xFF,0xFF,0x1F,0x1F,0x1F,0x1F,0xFF,0xFE,0xFE,0xFE,0xFC,0xFC,0xF8,0xF0,0xE0,0xC0,0x80,0x00,0x00},
 
        {0x00,0x00,0x80,0xC0,0xE0,0xF0,0xF8,0xFC,0xFC,0xFE,0xFE,0xFE,0xFF,0xFF,0xFF,0x1F,0x1F,0x1F,0x1F,0xFF,0xFE,0xFE,0xFE,0xFC,0xFC,0xF8,0xF0,0xE0,0xC0,0x80,0x00,0x00},
 
 
};
 
src/display.c
Show inline comments
 
@@ -42,27 +42,27 @@ static uint8_t toggle = 0;
 

	
 
void display_1hz(void)
 
{
 
	toggle = !toggle;
 
    toggle = !toggle;
 
}
 

	
 
static char updown(void)
 
{
 
	if(toggle)
 
		return '\x8f';
 
	else
 
		return '\x90';
 
    if(toggle)
 
        return '\x8f';
 
    else
 
        return '\x90';
 
}
 

	
 
// Display state machine
 
void display_process(void)
 
{
 
	therm_status_t* status = runtime_status();
 
	therm_settings_t* set = flash_getsettings();
 
    therm_status_t* status = runtime_status();
 
    therm_settings_t* set = flash_getsettings();
 

	
 

	
 
    uint8_t state_changed = status->state != last_state;
 
    last_state = status->state;
 
    
 

	
 
    uint8_t temp_changed = status->temp != last_temp;
 
    last_temp = status->temp;
 

	
 
@@ -85,23 +85,23 @@ void display_process(void)
 
            if(temp_changed || state_changed) {
 
                char tempstr[16];
 
                snprintf(tempstr, 16, "Temp: %4.1f", status->temp);
 
//                ssd1306_drawstring("             ", 3, 40);
 
                //                ssd1306_drawstring("             ", 3, 40);
 

	
 
                ssd1306_drawstring(tempstr, 3, 40);
 
            }
 

	
 
            if (state_changed) {
 
            	ssd1306_drawlogo();
 
                ssd1306_drawlogo();
 
            }
 

	
 
            switch(goto_mode) {
 

	
 
                case MODE_HEAT:
 
                {
 
					if(set->val.plant_type == PLANT_HEATER)
 
						ssd1306_drawstring("\x83 heat      ", 1, 40);
 
					else
 
						ssd1306_drawstring("\x83 cool      ", 1, 40);
 
                    if(set->val.plant_type == PLANT_HEATER)
 
                        ssd1306_drawstring("\x83 heat      ", 1, 40);
 
                    else
 
                        ssd1306_drawstring("\x83 cool      ", 1, 40);
 

	
 
                } break;
 

	
 
@@ -115,12 +115,12 @@ void display_process(void)
 
                    ssd1306_drawstring("\x83 reset    ", 1, 40);
 
                } break;
 

	
 
				#ifdef BOOTLOADER_SHORTCUT
 
#ifdef BOOTLOADER_SHORTCUT
 
                case MODE_BOOTLOADER:
 
                {
 
                    ssd1306_drawstring("\x83 dfu      ", 1, 40);
 
                }
 
				#endif
 
#endif
 
            }
 

	
 
            // Button handler
 
@@ -136,16 +136,16 @@ void display_process(void)
 
                        status->state = STATE_RESET;
 
                        reset_mode = RESET_REBOOT;
 
                        break;
 
					#ifdef BOOTLOADER_SHORTCUT
 
#ifdef BOOTLOADER_SHORTCUT
 
                    case MODE_BOOTLOADER:
 
                        ssd1306_clearscreen();
 
                        ssd1306_drawstring("Bootloader Entered", 0, 0);
 
                        ssd1306_drawstring("Device won't boot", 2, 0);
 
                        ssd1306_drawstring("until reflashed!", 3, 0);
 
//                        bootloader_enter(); // Resets into bootloader
 
                        //                        bootloader_enter(); // Resets into bootloader
 
                        status->state = STATE_RESET; // Just in case
 
                        break;
 
					#endif
 
#endif
 
                    default:
 
                        status->state = STATE_PREHEAT;
 
                }
 
@@ -174,7 +174,7 @@ void display_process(void)
 
            ssd1306_drawlogo();
 

	
 
            ssd1306_drawchar(updown(), 1, 52);
 
			ssd1306_drawstring(sensor_lookup[set->val.sensor_type], 1, 60);
 
            ssd1306_drawstring(sensor_lookup[set->val.sensor_type], 1, 60);
 
            ssd1306_drawstring("Press to accept", 3, 40);
 

	
 
            // Button handler
 
@@ -183,9 +183,9 @@ void display_process(void)
 
            }
 
            else
 
            {
 
            	user_input((uint16_t*)&set->val.sensor_type);
 
                user_input((uint16_t*)&set->val.sensor_type);
 
                if(set->val.sensor_type > 6)
 
                	set->val.sensor_type = 6;
 
                    set->val.sensor_type = 6;
 

	
 
            }
 
            // Event Handler
 
@@ -210,7 +210,7 @@ void display_process(void)
 
                ssd1306_drawstring("Thermostat", 1, 60);
 

	
 
            ssd1306_drawstring("Press to accept", 3, 40);
 
            
 

	
 
            // Button handler
 
            if(SW_BTN_PRESSED) {
 
                status->state = STATE_SETPLANTTYPE;
 
@@ -223,7 +223,7 @@ void display_process(void)
 
            }
 
            // Event Handler
 
            // N/A
 
 
 

	
 
        } break;
 

	
 

	
 
@@ -243,7 +243,7 @@ void display_process(void)
 
                ssd1306_drawstring("Cooler", 1, 60);
 

	
 
            ssd1306_drawstring("Press to accept", 3, 40);
 
            
 

	
 
            // Button handler
 
            if(SW_BTN_PRESSED) {
 
                if(set->val.control_mode == MODE_PID)
 
@@ -259,7 +259,7 @@ void display_process(void)
 
            }
 
            // Event Handler
 
            // N/A
 
 
 

	
 
        } break;
 

	
 

	
 
@@ -279,7 +279,7 @@ void display_process(void)
 
            snprintf(tempstr, 12, "P=%d", set->val.k_p);
 
            ssd1306_drawstring(tempstr, 1, 60);
 
            ssd1306_drawstring("Press to accept", 3, 40);
 
            
 

	
 
            // Button handler
 
            if(SW_BTN_PRESSED) {
 
                status->state = STATE_SETI;
 
@@ -290,7 +290,7 @@ void display_process(void)
 

	
 
            // Event Handler
 
            // N/A
 
 
 

	
 
        } break;
 

	
 
        case STATE_SETI:
 
@@ -308,7 +308,7 @@ void display_process(void)
 
            ssd1306_drawstring(tempstr, 1, 60);
 

	
 
            ssd1306_drawstring("Press to accept", 3, 40);
 
            
 

	
 
            // Button handler
 
            if(SW_BTN_PRESSED) {
 
                status->state = STATE_SETD;
 
@@ -319,7 +319,7 @@ void display_process(void)
 

	
 
            // Event Handler
 
            // N/A
 
 
 

	
 
        } break;
 

	
 
        case STATE_SETD:
 
@@ -348,7 +348,7 @@ void display_process(void)
 

	
 
            // Event Handler
 
            // N/A
 
 
 

	
 
        } break;
 

	
 

	
 
@@ -407,7 +407,7 @@ void display_process(void)
 

	
 
            // Event Handler
 
            // N/A
 
 
 

	
 
        } break;
 

	
 
        case STATE_SETBOOTTOBREW:
 
@@ -419,7 +419,7 @@ void display_process(void)
 
            ssd1306_drawlogo();
 

	
 
            ssd1306_drawstring("sob=", 1, 50);
 
            
 

	
 
            ssd1306_drawchar(updown(), 1, 43);
 

	
 
            if(set->val.boottobrew)
 
@@ -442,7 +442,7 @@ void display_process(void)
 

	
 
            // Event Handler
 
            // N/A
 
 
 

	
 
        } break;
 

	
 
        case STATE_SETUNITS:
 
@@ -475,7 +475,7 @@ void display_process(void)
 

	
 
            // Event Handler
 
            // N/A
 
 
 

	
 
        } break;
 

	
 

	
 
@@ -497,7 +497,7 @@ void display_process(void)
 

	
 
            // Button handler
 
            if(SW_BTN_PRESSED) {
 
            	flash_savesettings();
 
                flash_savesettings();
 
                status->state = STATE_IDLE;
 
            }
 
            else {
 
@@ -506,7 +506,7 @@ void display_process(void)
 

	
 
            // Event Handler
 
            // N/A
 
 
 

	
 
        } break;
 

	
 

	
 
@@ -539,7 +539,7 @@ void display_process(void)
 
            if(status->temp >= status->setpoint) {
 
                status->state = STATE_MAINTAIN;
 
            }
 
 
 

	
 
        } break;
 

	
 
        case STATE_MAINTAIN:
 
@@ -568,7 +568,7 @@ void display_process(void)
 

	
 
            // Event Handler
 
            // N/A
 
 
 

	
 
        } break;
 

	
 
        // Thermocouple error
 
@@ -601,9 +601,9 @@ void display_process(void)
 
            // Button handler
 
            if(SW_BTN_PRESSED) {
 
                status->state = STATE_IDLE;
 
				#ifdef MAX31865_RTD_SENSOR
 
				max31865_clear_errors(spi_get());
 
				#endif
 
#ifdef MAX31865_RTD_SENSOR
 
                max31865_clear_errors(spi_get());
 
#endif
 
            }
 
            else if(SW_RIGHT_PRESSED) {
 
                set->val.ignore_error = 1;
 
@@ -612,7 +612,7 @@ void display_process(void)
 
            // Event Handler
 
            // Maybe handle if TC is plugged in
 
            // N/A
 
 
 

	
 
        } break;
 

	
 

	
 
@@ -627,10 +627,10 @@ void display_process(void)
 
            ssd1306_drawlogo();
 

	
 
            switch(reset_mode) {
 
				case RESET_DEFAULTS:
 
				{
 
					ssd1306_drawstring("-> defaults   ", 1, 40);
 
				} break;
 
                case RESET_DEFAULTS:
 
                {
 
                    ssd1306_drawstring("-> defaults   ", 1, 40);
 
                } break;
 
                case RESET_BOOTLOADER:
 
                {
 
                    ssd1306_drawstring("-> bootloader ", 1, 40);
 
@@ -655,14 +655,14 @@ void display_process(void)
 
                        ssd1306_drawstring("Device won't boot", 2, 0);
 
                        ssd1306_drawstring("until reflashed!", 3, 0);
 
                        HAL_Delay(1000);
 
//                        bootloader_enter(); // Resets into bootloader
 
                        //                        bootloader_enter(); // Resets into bootloader
 
                        status->state = STATE_RESET; // Just in case
 
                    } break;
 
                    case RESET_DEFAULTS:
 
                    {
 
                        status->state = STATE_RESET;
 
//                        flash_load_defaults(set);
 
//                        flash_save(set);
 
                        //                        flash_load_defaults(set);
 
                        //                        flash_save(set);
 
                        NVIC_SystemReset();
 
                    } break;
 
                    case RESET_REBOOT:
 
@@ -696,7 +696,7 @@ void display_process(void)
 
            status->pid_enabled = 0;
 

	
 
        } break;
 
            
 

	
 
    }
 

	
 
    if(last_state != status->state) {
src/main.c
Show inline comments
 
@@ -21,65 +21,65 @@
 
 
int main(void)
 
{
 
	sysclock_init();
 
	hal_init();
 
	gpio_init();
 
    sysclock_init();
 
    hal_init();
 
    gpio_init();
 
 
	ssd1306_init();
 
    ssd1306_init();
 
 
	// Startup screen
 
    // Startup screen
 
    display_startup_screen();
 
    HAL_Delay(2000);
 
    ssd1306_clearscreen();
 
	ssd1306_drawlogo();
 
    ssd1306_drawlogo();
 
 
    // Default status
 
	runtime_status()->temp = 0.0;
 
	runtime_status()->state_resume = 0;
 
	runtime_status()->state = STATE_IDLE;
 
	runtime_status()->setpoint = 70;
 
	runtime_status()->pid_enabled = 0;
 
    runtime_status()->temp = 0.0;
 
    runtime_status()->state_resume = 0;
 
    runtime_status()->state = STATE_IDLE;
 
    runtime_status()->setpoint = 70;
 
    runtime_status()->pid_enabled = 0;
 
 
    pid_init();
 
    pwmout_init();
 
    flash_init();
 
	watchdog_init();
 
	tempsense_init();
 
    watchdog_init();
 
    tempsense_init();
 
 
	// Soft timers
 
    // Soft timers
 
    uint32_t last_pid = 0;
 
    uint32_t last_thermostat = 0;
 
    uint32_t last_1hz = 0;
 
    uint32_t last_5hz = 0;
 
 
	int16_t duty = 0;
 
    int16_t duty = 0;
 
 
	while (1)
 
	{
 
    while (1)
 
    {
 
 
		if(HAL_GetTick() - last_1hz > 750)
 
		{
 
			display_1hz();
 
			last_1hz = HAL_GetTick();
 
		}
 
        if(HAL_GetTick() - last_1hz > 750)
 
        {
 
            display_1hz();
 
            last_1hz = HAL_GetTick();
 
        }
 
 
		if(HAL_GetTick() - last_5hz > 200)
 
		{
 
			tempsense_readtemp();
 
			runtime_status()->temp = tempsense_gettemp();
 
			last_5hz = HAL_GetTick();
 
		}
 
        if(HAL_GetTick() - last_5hz > 200)
 
        {
 
            tempsense_readtemp();
 
            runtime_status()->temp = tempsense_gettemp();
 
            last_5hz = HAL_GetTick();
 
        }
 
 
        if(flash_getsettings()->val.control_mode == MODE_PID && (HAL_GetTick() - last_pid > PID_PERIOD))
 
        {
 
        	duty = pid_process();
 
            duty = pid_process();
 
            last_pid = HAL_GetTick();
 
        }
 
 
        // Thermostatic control
 
        if(flash_getsettings()->val.control_mode == MODE_THERMOSTAT && HAL_GetTick() - last_thermostat > SSR_PERIOD)
 
        {
 
        	duty = thermostat_process();
 
            duty = thermostat_process();
 
            last_thermostat = HAL_GetTick();
 
        }
 
 
@@ -88,24 +88,24 @@ int main(void)
 
        watchdog_feed();
 
 
 
//        // Transmit temperature over USB-CDC on a regular basis
 
//        if(HAL_GetTick() - last_vcp_tx > VCP_TX_FREQ)
 
//        {
 
//            // Print temp to cdc
 
//            char tempstr[16];
 
//            itoa_fp(status.temp, status.temp_frac, tempstr);
 
//            uint8_t numlen = strlen(tempstr);
 
//            tempstr[numlen] = '\r';
 
//            tempstr[numlen+1] = '\n';
 
//
 
//    //        if(set.val.usb_plugged)
 
//    //            CDC_Transmit_FS(tempstr, numlen+2);
 
//           // while(CDC_Transmit_FS("\r\n", 2) == USBD_BUSY);
 
//
 
//            last_vcp_tx = HAL_GetTick();
 
//        }
 
        //        // Transmit temperature over USB-CDC on a regular basis
 
        //        if(HAL_GetTick() - last_vcp_tx > VCP_TX_FREQ)
 
        //        {
 
        //            // Print temp to cdc
 
        //            char tempstr[16];
 
        //            itoa_fp(status.temp, status.temp_frac, tempstr);
 
        //            uint8_t numlen = strlen(tempstr);
 
        //            tempstr[numlen] = '\r';
 
        //            tempstr[numlen+1] = '\n';
 
        //
 
        //    //        if(set.val.usb_plugged)
 
        //    //            CDC_Transmit_FS(tempstr, numlen+2);
 
        //           // while(CDC_Transmit_FS("\r\n", 2) == USBD_BUSY);
 
        //
 
        //            last_vcp_tx = HAL_GetTick();
 
        //        }
 
 
	}
 
    }
 
}
 
 
src/pid.c
Show inline comments
 
@@ -12,105 +12,105 @@ static pid_state_t state;
 
// Initialize PID loop
 
void pid_init()
 
{
 
	state.i_state = 0;
 
	state.last_pid_temp = 0;
 
	state.last_pid_temp_frac = 0;
 
    state.i_state = 0;
 
    state.last_pid_temp = 0;
 
    state.last_pid_temp_frac = 0;
 
}
 

	
 

	
 
// Apply PID output values
 
float pid_process(void)
 
{
 
//            #ifdef MAX31865_RTD_SENSOR
 
//            max31865_readtemp(spi_get(), &set, &status);
 
//			#else
 
//			max31855_readtemp(spi_get(), &set, &status); // Read MAX31855
 
//			#endif
 
    //            #ifdef MAX31865_RTD_SENSOR
 
    //            max31865_readtemp(spi_get(), &set, &status);
 
    //			#else
 
    //			max31855_readtemp(spi_get(), &set, &status); // Read MAX31855
 
    //			#endif
 

	
 
	float ssr_output = 0;
 
    float ssr_output = 0;
 

	
 

	
 
	if(runtime_status()->pid_enabled)
 
	{
 
		// Get ssr output for next time
 
		int16_t power_percent = pid_update();
 
    if(runtime_status()->pid_enabled)
 
    {
 
        // Get ssr output for next time
 
        int16_t power_percent = pid_update();
 

	
 
		if(flash_getsettings()->val.plant_type == PLANT_COOLER)
 
			power_percent *= -1;
 
        if(flash_getsettings()->val.plant_type == PLANT_COOLER)
 
            power_percent *= -1;
 

	
 
		//power-percent is 0-1000?
 
		ssr_output = power_percent; //(((uint32_t)SSR_PERIOD * (uint32_t)10 * (uint32_t)100) * power_percent) / (uint32_t)1000000;
 
        //power-percent is 0-1000?
 
        ssr_output = power_percent; //(((uint32_t)SSR_PERIOD * (uint32_t)10 * (uint32_t)100) * power_percent) / (uint32_t)1000000;
 

	
 
		// put ssr output on display
 
		ssd1306_drawstring("      ", 0, 90); //fixme: this is bad, but I can't get the old digits to clear otherwise
 
		char tempstr[8];
 
		snprintf(tempstr, 8, "%4.1f%%", ssr_output/10.0);
 
		ssd1306_drawstring(tempstr, 0, 85);
 
	}
 
	else
 
	{
 
		ssr_output = 0.0;
 
	}
 
        // put ssr output on display
 
        ssd1306_drawstring("      ", 0, 90); //fixme: this is bad, but I can't get the old digits to clear otherwise
 
        char tempstr[8];
 
        snprintf(tempstr, 8, "%4.1f%%", ssr_output/10.0);
 
        ssd1306_drawstring(tempstr, 0, 85);
 
    }
 
    else
 
    {
 
        ssr_output = 0.0;
 
    }
 

	
 
	return ssr_output; //ssr_output;
 
    return ssr_output; //ssr_output;
 
}
 

	
 

	
 
// Calculate new PID values
 
int16_t pid_update(void)
 
{
 
	therm_status_t* status = runtime_status();
 
	therm_settings_t* set = flash_getsettings();
 
    therm_status_t* status = runtime_status();
 
    therm_settings_t* set = flash_getsettings();
 

	
 
	// Convert temperature to fixed point number with 1/10th resolution
 
	float temp = status->temp;
 
    // Convert temperature to fixed point number with 1/10th resolution
 
    float temp = status->temp;
 

	
 
	// Calculate instantaneous error
 
	// EMZ FIXME: was regulating to 1 degree below the setpoint! +1 accomadates for this
 
	int16_t error = (status->setpoint+1) - temp;
 
    // Calculate instantaneous error
 
    // EMZ FIXME: was regulating to 1 degree below the setpoint! +1 accomadates for this
 
    int16_t error = (status->setpoint+1) - temp;
 

	
 
	// Proportional component
 
	int32_t p_term = set->val.k_p * error;
 
    // Proportional component
 
    int32_t p_term = set->val.k_p * error;
 

	
 
	// Error accumulator (integrator)
 
	state.i_state += error;
 
    // Error accumulator (integrator)
 
    state.i_state += error;
 

	
 
	// to prevent the iTerm getting huge from lots of
 
	//  error, we use a "windup guard"
 
	// (this happens when the machine is first turned on and
 
	// it cant help be cold despite its best efforts)
 
	// not necessary, but this makes windup guard values
 
	// relative to the current iGain
 
	int32_t windup_guard_res = (set->val.windup_guard * 10) / set->val.k_i;
 
    // to prevent the iTerm getting huge from lots of
 
    //  error, we use a "windup guard"
 
    // (this happens when the machine is first turned on and
 
    // it cant help be cold despite its best efforts)
 
    // not necessary, but this makes windup guard values
 
    // relative to the current iGain
 
    int32_t windup_guard_res = (set->val.windup_guard * 10) / set->val.k_i;
 

	
 
	// Calculate integral term with windup guard
 
	if (state.i_state > windup_guard_res)
 
	  state.i_state = windup_guard_res;
 
	else if (state.i_state < -windup_guard_res)
 
	  state.i_state = -windup_guard_res;
 
    // Calculate integral term with windup guard
 
    if (state.i_state > windup_guard_res)
 
        state.i_state = windup_guard_res;
 
    else if (state.i_state < -windup_guard_res)
 
        state.i_state = -windup_guard_res;
 

	
 
	// Discard I if we've achieved the setpoint (TODO: add setting disable/enable)
 
	if(error <= 0)
 
		state.i_state = 0;
 
    // Discard I if we've achieved the setpoint (TODO: add setting disable/enable)
 
    if(error <= 0)
 
        state.i_state = 0;
 

	
 
	int32_t i_term = set->val.k_i * state.i_state;
 
    int32_t i_term = set->val.k_i * state.i_state;
 

	
 
	// Calculate differential term (slope since last iteration)
 
	int32_t d_term = (set->val.k_d * (temp - state.last_pid_temp));
 
    // Calculate differential term (slope since last iteration)
 
    int32_t d_term = (set->val.k_d * (temp - state.last_pid_temp));
 

	
 
	// Save temperature for next iteration
 
	state.last_pid_temp = temp;
 
    // Save temperature for next iteration
 
    state.last_pid_temp = temp;
 

	
 
	int16_t result = (p_term + i_term - d_term) / 10;
 
    int16_t result = (p_term + i_term - d_term) / 10;
 

	
 
	// Put out tenths of percent, 0-1000.
 
	if(result > 1000)
 
	result = 1000;
 
	else if(result < -1000)
 
	result = -1000;
 
    // Put out tenths of percent, 0-1000.
 
    if(result > 1000)
 
        result = 1000;
 
    else if(result < -1000)
 
        result = -1000;
 

	
 
	// Return feedback
 
	return result;
 
    // Return feedback
 
    return result;
 
}
 

	
 

	
src/pwmout.c
Show inline comments
 
@@ -17,68 +17,68 @@ static uint32_t last_ssr_on = 0;
 
// Initialize hardware PWM output
 
void pwmout_init(void)
 
{
 
	GPIO_InitTypeDef GPIO_InitStruct;
 
    GPIO_InitTypeDef GPIO_InitStruct;
 
    __HAL_RCC_TIM17_CLK_ENABLE();
 
    __HAL_RCC_GPIOB_CLK_ENABLE();
 

	
 
	// Configure LED GPIO pins
 
	GPIO_InitStruct.Pin = SSR_PIN;
 
	GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; //GPIO_MODE_AF_PP;
 
	GPIO_InitStruct.Pull = GPIO_NOPULL;
 
	GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
 
//    GPIO_InitStruct.Alternate = GPIO_AF1_TIM17;
 
	HAL_GPIO_Init(SSR_GPIO_Port, &GPIO_InitStruct);
 
    // Configure LED GPIO pins
 
    GPIO_InitStruct.Pin = SSR_PIN;
 
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; //GPIO_MODE_AF_PP;
 
    GPIO_InitStruct.Pull = GPIO_NOPULL;
 
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
 
    //    GPIO_InitStruct.Alternate = GPIO_AF1_TIM17;
 
    HAL_GPIO_Init(SSR_GPIO_Port, &GPIO_InitStruct);
 

	
 

	
 
	TIM_OC_InitTypeDef sConfigOC;
 
	TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig;
 
    TIM_OC_InitTypeDef sConfigOC;
 
    TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig;
 

	
 
	htim17.Instance = TIM17;
 
	htim17.Init.Prescaler = 6000;
 
	htim17.Init.CounterMode = TIM_COUNTERMODE_UP;
 
	htim17.Init.Period = 1000;
 
	htim17.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
 
	htim17.Init.RepetitionCounter = 0;
 
	if (HAL_TIM_Base_Init(&htim17) != HAL_OK)
 
	{
 
		error_assert(ERR_PERIPHINIT);
 
	}
 
    htim17.Instance = TIM17;
 
    htim17.Init.Prescaler = 6000;
 
    htim17.Init.CounterMode = TIM_COUNTERMODE_UP;
 
    htim17.Init.Period = 1000;
 
    htim17.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
 
    htim17.Init.RepetitionCounter = 0;
 
    if (HAL_TIM_Base_Init(&htim17) != HAL_OK)
 
    {
 
        error_assert(ERR_PERIPHINIT);
 
    }
 

	
 
	if (HAL_TIM_OC_Init(&htim17) != HAL_OK)
 
	{
 
		error_assert(ERR_PERIPHINIT);
 
	}
 
    if (HAL_TIM_OC_Init(&htim17) != HAL_OK)
 
    {
 
        error_assert(ERR_PERIPHINIT);
 
    }
 

	
 
	sConfigOC.OCMode = TIM_OCMODE_TOGGLE; //TIM_OCMODE_PWM1;
 
	sConfigOC.Pulse = 200;
 
	sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
 
	sConfigOC.OCNPolarity = TIM_OCNPOLARITY_LOW;
 
	sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
 
	sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
 
	sConfigOC.OCNIdleState = TIM_OCIDLESTATE_SET;
 
	if (HAL_TIM_OC_ConfigChannel(&htim17, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
 
	{
 
		error_assert(ERR_PERIPHINIT);
 
	}
 
    sConfigOC.OCMode = TIM_OCMODE_TOGGLE; //TIM_OCMODE_PWM1;
 
    sConfigOC.Pulse = 200;
 
    sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
 
    sConfigOC.OCNPolarity = TIM_OCNPOLARITY_LOW;
 
    sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
 
    sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
 
    sConfigOC.OCNIdleState = TIM_OCIDLESTATE_SET;
 
    if (HAL_TIM_OC_ConfigChannel(&htim17, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
 
    {
 
        error_assert(ERR_PERIPHINIT);
 
    }
 

	
 
	sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE;
 
	sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE;
 
	sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;
 
	sBreakDeadTimeConfig.DeadTime = 0;
 
	sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE;
 
	sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;
 
	sBreakDeadTimeConfig.BreakFilter = 0;
 
	sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;
 
	if (HAL_TIMEx_ConfigBreakDeadTime(&htim17, &sBreakDeadTimeConfig) != HAL_OK)
 
	{
 
		error_assert(ERR_PERIPHINIT);
 
	}
 
    sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE;
 
    sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE;
 
    sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;
 
    sBreakDeadTimeConfig.DeadTime = 0;
 
    sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE;
 
    sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;
 
    sBreakDeadTimeConfig.BreakFilter = 0;
 
    sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;
 
    if (HAL_TIMEx_ConfigBreakDeadTime(&htim17, &sBreakDeadTimeConfig) != HAL_OK)
 
    {
 
        error_assert(ERR_PERIPHINIT);
 
    }
 

	
 
    HAL_NVIC_SetPriority(TIM1_TRG_COM_TIM17_IRQn, 0, 0);
 
    HAL_NVIC_EnableIRQ(TIM1_TRG_COM_TIM17_IRQn);
 

	
 

	
 
	HAL_TIM_OC_Start_IT(&htim17, TIM_CHANNEL_1);
 
    HAL_TIM_OC_Start_IT(&htim17, TIM_CHANNEL_1);
 
    __HAL_TIM_ENABLE_IT(&htim17, TIM_IT_UPDATE);
 

	
 
}
 
@@ -90,21 +90,21 @@ void pwmout_init(void)
 
// also duty cycling isn't working correctly...
 
void pwmout_process(int16_t duty)
 
{
 
	if(duty == 0)
 
	{
 
		HAL_GPIO_WritePin(SSR, 0);
 
		HAL_GPIO_WritePin(LED, 0);
 
	}
 
	if(duty < 0)
 
		duty = 0;
 
    if(duty == 0)
 
    {
 
        HAL_GPIO_WritePin(SSR, 0);
 
        HAL_GPIO_WritePin(LED, 0);
 
    }
 
    if(duty < 0)
 
        duty = 0;
 

	
 

	
 
	htim17.Instance->CCR1 = duty; //duty;
 
    htim17.Instance->CCR1 = duty; //duty;
 
}
 

	
 

	
 
// Accessor for timer handle
 
TIM_HandleTypeDef* pwmout_get_tim(void)
 
{
 
	return &htim17;
 
    return &htim17;
 
}
src/system/error.c
Show inline comments
 
@@ -23,24 +23,24 @@ static volatile uint8_t num_errors_asser
 
// Set the passed error flag
 
void error_assert(const uint8_t errno)
 
{
 
	// Errno invalid: exceeds bit length of error register
 
	if(errno >= 32)
 
		return;
 
    // Errno invalid: exceeds bit length of error register
 
    if(errno >= 32)
 
        return;
 
 
	// Don't count info messages as true errors
 
	if(errno > ERR_INFO)
 
	{
 
		// Set error flag
 
		err_reg |= (1<<errno);
 
    // Don't count info messages as true errors
 
    if(errno > ERR_INFO)
 
    {
 
        // Set error flag
 
        err_reg |= (1<<errno);
 
 
		// Count how many errors have occurred
 
		num_errors_asserted++;
 
	}
 
        // Count how many errors have occurred
 
        num_errors_asserted++;
 
    }
 
 
	// Dispatch error message over IRdA and/or debug port
 
    // Dispatch error message over IRdA and/or debug port
 
#ifdef DEBUG_ERROUT_ENABLE
 
	char outbuf[256];
 
	snprintf(outbuf, 256, "[%lu\] %s (no details) \r\n", HAL_GetTick(), error_message[errno]);
 
    char outbuf[256];
 
    snprintf(outbuf, 256, "[%lu\] %s (no details) \r\n", HAL_GetTick(), error_message[errno]);
 
#endif
 
}
 
 
@@ -48,34 +48,34 @@ void error_assert(const uint8_t errno)
 
// Set the passed error flag with details about the error
 
void error_assert_info(const uint8_t errno, const char* details)
 
{
 
	// Errno invalid: exceeds bit length of error register
 
	if(errno >= 32)
 
		return;
 
    // Errno invalid: exceeds bit length of error register
 
    if(errno >= 32)
 
        return;
 
 
	// Don't count info messages as true errors
 
	if(errno > ERR_INFO)
 
	{
 
		// Set error flag
 
		err_reg |= (1<<errno);
 
    // Don't count info messages as true errors
 
    if(errno > ERR_INFO)
 
    {
 
        // Set error flag
 
        err_reg |= (1<<errno);
 
 
		// Count how many errors have occurred
 
		num_errors_asserted++;
 
	}
 
        // Count how many errors have occurred
 
        num_errors_asserted++;
 
    }
 
 
	// Dispatch error message over IRdA and/or debug port
 
    // Dispatch error message over IRdA and/or debug port
 
#ifdef DEBUG_ERROUT_ENABLE
 
	char outbuf[256];
 
	if(errno == ERR_INFO)
 
		snprintf(outbuf, 256, "Info: %s \r\n", details);
 
	else
 
		snprintf(outbuf, 256, "[%lu\] %s (%s) \r\n", HAL_GetTick(), error_message[errno], details);
 
	usb_send_debug(outbuf);
 
    char outbuf[256];
 
    if(errno == ERR_INFO)
 
        snprintf(outbuf, 256, "Info: %s \r\n", details);
 
    else
 
        snprintf(outbuf, 256, "[%lu\] %s (%s) \r\n", HAL_GetTick(), error_message[errno], details);
 
    usb_send_debug(outbuf);
 
 
	if(errno > ERR_INFO)
 
	{
 
		ir_efs_send(outbuf);
 
		error_sidechannel_addmsg(outbuf);
 
	}
 
    if(errno > ERR_INFO)
 
    {
 
        ir_efs_send(outbuf);
 
        error_sidechannel_addmsg(outbuf);
 
    }
 
#endif
 
}
 
 
@@ -83,19 +83,19 @@ void error_assert_info(const uint8_t err
 
// Check if the passed error flag has been asserted
 
inline uint8_t error_check(const uint8_t errno)
 
{
 
	return (err_reg & (1<<errno)) > 0;
 
    return (err_reg & (1<<errno)) > 0;
 
}
 
 
 
// Return 1 if any error has occurred
 
inline uint8_t error_occurred(void)
 
{
 
	return err_reg > 0;
 
    return err_reg > 0;
 
}
 
 
 
// Return the number of errors that have occurred
 
inline uint8_t error_count(void)
 
{
 
	return num_errors_asserted;
 
    return num_errors_asserted;
 
}
src/system/flash.c
Show inline comments
 
@@ -16,78 +16,78 @@ static therm_status_t status;
 
// Initialize flash and restore settings
 
void flash_init(void)
 
{
 
	flash_restoresettings();
 
    flash_restoresettings();
 
}
 
 
 
// Save settings to flash memory
 
void flash_savesettings()
 
{
 
	// Unlock flash memory
 
	HAL_FLASH_Unlock();
 
    // Unlock flash memory
 
    HAL_FLASH_Unlock();
 
 
	// Initialize eraser to erase one page of flash
 
	FLASH_EraseInitTypeDef eraser =
 
	{
 
			.TypeErase = TYPEERASE_PAGES,
 
			.PageAddress = eeprom_emulation,
 
			.NbPages = 1,
 
	};
 
	uint32_t errvar = 0;
 
    // Initialize eraser to erase one page of flash
 
    FLASH_EraseInitTypeDef eraser =
 
    {
 
            .TypeErase = TYPEERASE_PAGES,
 
            .PageAddress = eeprom_emulation,
 
            .NbPages = 1,
 
    };
 
    uint32_t errvar = 0;
 
 
	// Erase flash page
 
	HAL_FLASHEx_Erase(&eraser, &errvar);
 
    // Erase flash page
 
    HAL_FLASHEx_Erase(&eraser, &errvar);
 
 
	// Write new flash data
 
	uint16_t writectr;
 
	for(writectr = 0; writectr < 128; writectr++)// 128 bytes data
 
	{
 
		HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, eeprom_emulation+writectr,settings.data[writectr]);
 
	}
 
    // Write new flash data
 
    uint16_t writectr;
 
    for(writectr = 0; writectr < 128; writectr++)// 128 bytes data
 
    {
 
        HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, eeprom_emulation+writectr,settings.data[writectr]);
 
    }
 
 
	// Write magic value to flash
 
	HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, eeprom_emulation+FLASH_MAGIC_LOC,FLASH_MAGIC_VALUE);
 
    // Write magic value to flash
 
    HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, eeprom_emulation+FLASH_MAGIC_LOC,FLASH_MAGIC_VALUE);
 
 
	// Lock flash memory
 
	HAL_FLASH_Lock();
 
	HAL_Delay(2);
 
    // Lock flash memory
 
    HAL_FLASH_Lock();
 
    HAL_Delay(2);
 
}
 
 
 
// Restore configuration from flash memory, if any was previously saved
 
void flash_restoresettings(void)
 
{
 
	// Check for magic flash value
 
	if(eeprom_emulation[FLASH_MAGIC_LOC] == FLASH_MAGIC_VALUE)
 
	{
 
		// Read page of flash into settings structure
 
		uint16_t readctr = 0;
 
		for(readctr = 0; readctr < 128; readctr++)
 
		{
 
			settings.data[readctr] = eeprom_emulation[readctr];
 
		}
 
	}
 
	// No data in flash! Set defaults here
 
	else
 
	{
 
		settings.val.k_p = 100;
 
		settings.val.k_i = 2;
 
		settings.val.k_d = 0;
 
		settings.val.windup_guard = 300;
 
		settings.val.sensor_type = 1;
 
		//torestore.values.can_id = 22;
 
	}
 
    // Check for magic flash value
 
    if(eeprom_emulation[FLASH_MAGIC_LOC] == FLASH_MAGIC_VALUE)
 
    {
 
        // Read page of flash into settings structure
 
        uint16_t readctr = 0;
 
        for(readctr = 0; readctr < 128; readctr++)
 
        {
 
            settings.data[readctr] = eeprom_emulation[readctr];
 
        }
 
    }
 
    // No data in flash! Set defaults here
 
    else
 
    {
 
        settings.val.k_p = 100;
 
        settings.val.k_i = 2;
 
        settings.val.k_d = 0;
 
        settings.val.windup_guard = 300;
 
        settings.val.sensor_type = 1;
 
        //torestore.values.can_id = 22;
 
    }
 
}
 
 
 
// Accessor to retrieve settings structure
 
inline therm_settings_t* flash_getsettings(void)
 
{
 
	return &settings;
 
    return &settings;
 
}
 
 
inline therm_status_t* runtime_status(void)
 
{
 
	return &status;
 
    return &status;
 
}
 
src/system/gpio.c
Show inline comments
 
@@ -14,42 +14,42 @@ static uint32_t change_time_reset = 0;
 
// Initialize GPIOs
 
void gpio_init(void)
 
{
 
	GPIO_InitTypeDef GPIO_InitStruct;
 
    GPIO_InitTypeDef GPIO_InitStruct;
 
 
	// GPIO Ports Clock Enable
 
	__GPIOA_CLK_ENABLE();
 
	__GPIOB_CLK_ENABLE();
 
	__GPIOF_CLK_ENABLE();
 
    // GPIO Ports Clock Enable
 
    __GPIOA_CLK_ENABLE();
 
    __GPIOB_CLK_ENABLE();
 
    __GPIOF_CLK_ENABLE();
 
 
 
	// Configure LED GPIO pins
 
	GPIO_InitStruct.Pin = LED_PIN;
 
	GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
 
	GPIO_InitStruct.Pull = GPIO_NOPULL;
 
	GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
 
	HAL_GPIO_Init(LED_GPIO_Port, &GPIO_InitStruct);
 
    // Configure LED GPIO pins
 
    GPIO_InitStruct.Pin = LED_PIN;
 
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
 
    GPIO_InitStruct.Pull = GPIO_NOPULL;
 
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
 
    HAL_GPIO_Init(LED_GPIO_Port, &GPIO_InitStruct);
 
 
 
	GPIO_InitStruct.Pin = SW_A_Pin|SW_B_Pin|SW_C_Pin|SW_D_Pin;
 
	GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
 
	GPIO_InitStruct.Pull = GPIO_PULLUP;
 
	HAL_GPIO_Init(SW_C_GPIO_Port, &GPIO_InitStruct);
 
    GPIO_InitStruct.Pin = SW_A_Pin|SW_B_Pin|SW_C_Pin|SW_D_Pin;
 
    GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
 
    GPIO_InitStruct.Pull = GPIO_PULLUP;
 
    HAL_GPIO_Init(SW_C_GPIO_Port, &GPIO_InitStruct);
 
 
	GPIO_InitStruct.Pin = SW_BTN_Pin;
 
	GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
 
	GPIO_InitStruct.Pull = GPIO_PULLUP;
 
	HAL_GPIO_Init(SW_BTN_GPIO_Port, &GPIO_InitStruct);
 
    GPIO_InitStruct.Pin = SW_BTN_Pin;
 
    GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
 
    GPIO_InitStruct.Pull = GPIO_PULLUP;
 
    HAL_GPIO_Init(SW_BTN_GPIO_Port, &GPIO_InitStruct);
 
 
 
	/* EXTI interrupt init*/
 
	HAL_NVIC_SetPriority(EXTI9_5_IRQn, 0, 0);
 
	HAL_NVIC_EnableIRQ(EXTI9_5_IRQn);
 
    /* EXTI interrupt init*/
 
    HAL_NVIC_SetPriority(EXTI9_5_IRQn, 0, 0);
 
    HAL_NVIC_EnableIRQ(EXTI9_5_IRQn);
 
 
	HAL_NVIC_SetPriority(EXTI15_10_IRQn, 0, 0);
 
	HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);
 
    HAL_NVIC_SetPriority(EXTI15_10_IRQn, 0, 0);
 
    HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);
 
 
	// Define startup State
 
	HAL_GPIO_WritePin(LED, 0);
 
    // Define startup State
 
    HAL_GPIO_WritePin(LED, 0);
 
 
}
 
 
@@ -73,17 +73,17 @@ void user_input(uint16_t* to_modify)
 
// Increment/decrement signed variable with up/down buttons
 
void user_input_signed(int32_t* to_modify)
 
{
 
	//fixme: need to cast to 16/32 bits correctly
 
    //fixme: need to cast to 16/32 bits correctly
 
    if(CHANGE_ELAPSED) {
 
        if(!HAL_GPIO_ReadPin(SW_UP) ) {
 
            CHANGE_RESET;
 
            if (*to_modify < 32768)
 
            	(*to_modify)++;
 
                (*to_modify)++;
 
        }
 
        else if(!HAL_GPIO_ReadPin(SW_DOWN)) {
 
            CHANGE_RESET;
 
            if (*to_modify >= -32768)
 
            	(*to_modify)--;
 
                (*to_modify)--;
 
        }
 
    }
 
}
src/system/interrupts.c
Show inline comments
 
@@ -13,76 +13,76 @@
 
// Systick interrupt
 
void SysTick_Handler(void)
 
{
 
  HAL_IncTick();
 
  HAL_SYSTICK_IRQHandler();
 
    HAL_IncTick();
 
    HAL_SYSTICK_IRQHandler();
 
}
 
 
void EXTI9_5_IRQHandler(void)
 
{
 
  HAL_GPIO_EXTI_IRQHandler(SW_B_Pin);
 
  HAL_GPIO_EXTI_IRQHandler(SW_A_Pin);
 
  HAL_GPIO_EXTI_IRQHandler(SW_C_Pin);
 
    HAL_GPIO_EXTI_IRQHandler(SW_B_Pin);
 
    HAL_GPIO_EXTI_IRQHandler(SW_A_Pin);
 
    HAL_GPIO_EXTI_IRQHandler(SW_C_Pin);
 
}
 
 
void EXTI15_10_IRQHandler(void)
 
{
 
  HAL_GPIO_EXTI_IRQHandler(SW_BTN_Pin);
 
    HAL_GPIO_EXTI_IRQHandler(SW_BTN_Pin);
 
}
 
 
uint32_t last_button_press = 0;
 
 
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
 
{
 
	switch(GPIO_Pin)
 
	{
 
		case SW_BTN_Pin:
 
		{
 
//			if(HAL_GetTick() > last_button_press + 100)
 
//			{
 
//				HAL_GPIO_TogglePin(LED_RED);
 
//				HAL_GPIO_TogglePin(GATE_DRIVE);
 
//				last_button_press = HAL_GetTick();
 
//			}
 
		} break;
 
	}
 
    switch(GPIO_Pin)
 
    {
 
        case SW_BTN_Pin:
 
        {
 
            //			if(HAL_GetTick() > last_button_press + 100)
 
            //			{
 
            //				HAL_GPIO_TogglePin(LED_RED);
 
            //				HAL_GPIO_TogglePin(GATE_DRIVE);
 
            //				last_button_press = HAL_GetTick();
 
            //			}
 
        } break;
 
    }
 
}
 
 
void TIM1_TRG_COM_TIM17_IRQHandler(void)
 
{
 
  /* USER CODE BEGIN TIM1_TRG_COM_TIM17_IRQn 0 */
 
    /* USER CODE BEGIN TIM1_TRG_COM_TIM17_IRQn 0 */
 
 
  /* USER CODE END TIM1_TRG_COM_TIM17_IRQn 0 */
 
    /* USER CODE END TIM1_TRG_COM_TIM17_IRQn 0 */
 
 
  HAL_TIM_IRQHandler(pwmout_get_tim());
 
  /* USER CODE BEGIN TIM1_TRG_COM_TIM17_IRQn 1 */
 
    HAL_TIM_IRQHandler(pwmout_get_tim());
 
    /* USER CODE BEGIN TIM1_TRG_COM_TIM17_IRQn 1 */
 
 
  /* USER CODE END TIM1_TRG_COM_TIM17_IRQn 1 */
 
    /* USER CODE END TIM1_TRG_COM_TIM17_IRQn 1 */
 
}
 
 
 
void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim)
 
{
 
	if(htim == pwmout_get_tim())
 
	{
 
		HAL_GPIO_WritePin(SSR, 0);
 
		HAL_GPIO_WritePin(LED, 0);
 
	}
 
    if(htim == pwmout_get_tim())
 
    {
 
        HAL_GPIO_WritePin(SSR, 0);
 
        HAL_GPIO_WritePin(LED, 0);
 
    }
 
}
 
 
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
 
{
 
	if(htim == pwmout_get_tim())
 
	{
 
		if(htim->Instance->CCR1 == 0)
 
		{
 
			HAL_GPIO_WritePin(LED, 0);
 
			HAL_GPIO_WritePin(SSR, 0);
 
		}
 
		else
 
		{
 
			HAL_GPIO_WritePin(LED, 1);
 
			HAL_GPIO_WritePin(SSR, 1);
 
		}
 
	}
 
    if(htim == pwmout_get_tim())
 
    {
 
        if(htim->Instance->CCR1 == 0)
 
        {
 
            HAL_GPIO_WritePin(LED, 0);
 
            HAL_GPIO_WritePin(SSR, 0);
 
        }
 
        else
 
        {
 
            HAL_GPIO_WritePin(LED, 1);
 
            HAL_GPIO_WritePin(SSR, 1);
 
        }
 
    }
 
}
 
src/system/sbrk.c
Show inline comments
 
@@ -6,17 +6,17 @@
 
 
caddr_t _sbrk(int incr)
 
{
 
extern char end asm("end");
 
static char *heap_end;
 
char *prev_heap_end;
 
    extern char end asm("end");
 
    static char *heap_end;
 
    char *prev_heap_end;
 
 
if (heap_end == 0) {
 
heap_end = &end;
 
    if (heap_end == 0) {
 
        heap_end = &end;
 
    }
 
 
    prev_heap_end = heap_end;
 
 
    heap_end += incr;
 
 
    return (caddr_t)prev_heap_end;
 
}
 
 
prev_heap_end = heap_end;
 
 
heap_end += incr;
 
 
return (caddr_t)prev_heap_end;
 
}
src/system/stringhelpers.c
Show inline comments
 
@@ -42,14 +42,14 @@ char* itoa_fp(int16_t i, uint8_t frac, c
 
        ++p;
 
        shifter = shifter/10;
 
    }while(shifter);
 
    
 

	
 
    ++p; // increment for decimal point
 

	
 
    do{
 
        ++p;
 
        frac_shifter = frac_shifter/10;
 
    }while(frac_shifter);
 
        
 

	
 

	
 
    // Null-terminate the string
 
    *p = '\0';
src/system/system.c
Show inline comments
 
@@ -8,48 +8,48 @@
 
// Configure and start system clocks
 
void sysclock_init(void)
 
{
 
	__SYSCFG_CLK_ENABLE();
 
    __SYSCFG_CLK_ENABLE();
 
 
	HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4);
 
    HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4);
 
 
	HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
 
    HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
 
 
 
 
	RCC_OscInitTypeDef RCC_OscInitStruct;
 
	  RCC_ClkInitTypeDef RCC_ClkInitStruct;
 
	  RCC_PeriphCLKInitTypeDef PeriphClkInit;
 
    RCC_OscInitTypeDef RCC_OscInitStruct;
 
    RCC_ClkInitTypeDef RCC_ClkInitStruct;
 
    RCC_PeriphCLKInitTypeDef PeriphClkInit;
 
 
	  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
 
	  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
 
	  RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
 
	  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
 
	  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
 
	  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL3;
 
	  HAL_RCC_OscConfig(&RCC_OscInitStruct);
 
    RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
 
    RCC_OscInitStruct.HSEState = RCC_HSE_ON;
 
    RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
 
    RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
 
    RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
 
    RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL3;
 
    HAL_RCC_OscConfig(&RCC_OscInitStruct);
 
 
	  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
 
	                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
 
	  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
 
	  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
 
	  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
 
	  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
 
	  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1);
 
    RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
 
            |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
 
    RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
 
    RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
 
    RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
 
    RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
 
    HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1);
 
 
	  PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USB|RCC_PERIPHCLK_ADC1|RCC_PERIPHCLK_TIM17;
 
	  PeriphClkInit.USBClockSelection = RCC_USBPLLCLK_DIV1;
 
	  PeriphClkInit.Adc1ClockSelection = RCC_ADC1PLLCLK_DIV1;
 
	  PeriphClkInit.Tim17ClockSelection = RCC_TIM17CLK_HCLK;
 
	  HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit);
 
    PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USB|RCC_PERIPHCLK_ADC1|RCC_PERIPHCLK_TIM17;
 
    PeriphClkInit.USBClockSelection = RCC_USBPLLCLK_DIV1;
 
    PeriphClkInit.Adc1ClockSelection = RCC_ADC1PLLCLK_DIV1;
 
    PeriphClkInit.Tim17ClockSelection = RCC_TIM17CLK_HCLK;
 
    HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit);
 
 
	  HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
 
    HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
 
 
	  HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
 
    HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
 
 
	  /* SysTick_IRQn interrupt configuration */
 
	  HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
 
    /* SysTick_IRQn interrupt configuration */
 
    HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
 
 
 
 
	__DMA1_CLK_ENABLE();
 
    __DMA1_CLK_ENABLE();
 
}
src/system/watchdog.c
Show inline comments
 
@@ -17,15 +17,15 @@ uint8_t watchdog_enabled = 0;
 
void watchdog_init(void)
 
{
 
#ifdef WATCHDOG_ENABLE
 
	// ~2 seconds?
 
    // ~2 seconds?
 
    hiwdg.Instance = IWDG;
 
    hiwdg.Init.Prescaler = IWDG_PRESCALER_4;
 
    hiwdg.Init.Window = 4095;
 
    hiwdg.Init.Reload = 4095;
 
    HAL_IWDG_Init(&hiwdg);
 
	watchdog_feed();
 
	HAL_IWDG_Start(&hiwdg);
 
	watchdog_enabled = 1;
 
    watchdog_feed();
 
    HAL_IWDG_Start(&hiwdg);
 
    watchdog_enabled = 1;
 
#endif
 
}
 
 
@@ -34,7 +34,7 @@ void watchdog_init(void)
 
void watchdog_feed(void)
 
{
 
#ifdef WATCHDOG_ENABLE
 
	if(watchdog_enabled)
 
		HAL_IWDG_Refresh(&hiwdg);
 
    if(watchdog_enabled)
 
        HAL_IWDG_Refresh(&hiwdg);
 
#endif
 
}
src/tempsense.c
Show inline comments
 
@@ -11,13 +11,13 @@
 
// Initialize temperature sensor
 
void tempsense_init(void)
 
{
 
	// TODO: Rework SPI stuff... init the port in a sharedlib then pass ref to display and tempsense
 
    // TODO: Rework SPI stuff... init the port in a sharedlib then pass ref to display and tempsense
 

	
 
	max31856_init(spi_get(), TEMPSENSE_MAX_CS_PORT, TEMPSENSE_MAX_CS_PIN, 0);
 
    max31856_init(spi_get(), TEMPSENSE_MAX_CS_PORT, TEMPSENSE_MAX_CS_PIN, 0);
 

	
 
	// Maybe don't perform temp sensor setup in here, but in readtemp?
 
	// what happens if the user changes the tempsense type while running?
 
	// we need to re-init...
 
    // Maybe don't perform temp sensor setup in here, but in readtemp?
 
    // what happens if the user changes the tempsense type while running?
 
    // we need to re-init...
 
}
 

	
 

	
 
@@ -25,39 +25,39 @@ void tempsense_init(void)
 
void tempsense_readtemp(void)
 
{
 

	
 
	switch(flash_getsettings()->val.sensor_type)
 
	{
 
		case SENSOR_TC_K:
 
		case SENSOR_TC_E:
 
		case SENSOR_TC_N:
 
		case SENSOR_TC_R:
 
		case SENSOR_TC_S:
 
		case SENSOR_TC_T:
 
		{
 
			// Read MAX31856
 
			max31856_process();
 
		} break;
 
    switch(flash_getsettings()->val.sensor_type)
 
    {
 
        case SENSOR_TC_K:
 
        case SENSOR_TC_E:
 
        case SENSOR_TC_N:
 
        case SENSOR_TC_R:
 
        case SENSOR_TC_S:
 
        case SENSOR_TC_T:
 
        {
 
            // Read MAX31856
 
            max31856_process();
 
        } break;
 

	
 
		case SENSOR_NTC:
 
		{
 
			// Read analog value from internal ADC, linearize the reading, etc
 
		} break;
 
        case SENSOR_NTC:
 
        {
 
            // Read analog value from internal ADC, linearize the reading, etc
 
        } break;
 

	
 
	}
 
    }
 

	
 
	// either return latest reading from DMA loop (NTC, etc)
 
	// or initiate a blocking read and return it.
 
	// Need to gracefully handle the timeout...
 
    // either return latest reading from DMA loop (NTC, etc)
 
    // or initiate a blocking read and return it.
 
    // Need to gracefully handle the timeout...
 
}
 

	
 

	
 
// Get latest temperature in requested units
 
float tempsense_gettemp(void)
 
{
 
	float temp_converted = max31856_latest_temp();
 
    float temp_converted = max31856_latest_temp();
 

	
 
	if(flash_getsettings()->val.temp_units == TEMP_UNITS_FAHRENHEIT)
 
		temp_converted = temp_converted * 1.8f + 32.0f;
 
    if(flash_getsettings()->val.temp_units == TEMP_UNITS_FAHRENHEIT)
 
        temp_converted = temp_converted * 1.8f + 32.0f;
 

	
 
	return temp_converted;
 
    return temp_converted;
 
}
src/thermostat.c
Show inline comments
 
@@ -11,52 +11,52 @@
 
float thermostat_process(void)
 
{
 

	
 
//            #ifdef MAX31865_RTD_SENSOR
 
//            max31865_readtemp(spi_get(), &set, &status);
 
//			#else
 
//			max31855_readtemp(spi_get(), &set, &status); // Read MAX31855
 
//			#endif
 
    //            #ifdef MAX31865_RTD_SENSOR
 
    //            max31865_readtemp(spi_get(), &set, &status);
 
    //			#else
 
    //			max31855_readtemp(spi_get(), &set, &status); // Read MAX31855
 
    //			#endif
 

	
 
			float ssr_output = 0.0;
 
			uint8_t thermostat_plant_on = 0;
 
    float ssr_output = 0.0;
 
    uint8_t thermostat_plant_on = 0;
 

	
 
			// TODO: Migrate this FxP conversion to the readtemp code or similar
 
			float temp = runtime_status()->temp;
 
    // TODO: Migrate this FxP conversion to the readtemp code or similar
 
    float temp = runtime_status()->temp;
 

	
 

	
 
			// EMZ FIXME: This could be way simpler
 
			if(flash_getsettings()->val.plant_type == PLANT_HEATER && runtime_status()->setpoint * 10 < temp - flash_getsettings()->val.hysteresis * 10)
 
				thermostat_plant_on = 1;
 
			else if(flash_getsettings()->val.plant_type == PLANT_HEATER && runtime_status()->setpoint * 10 > temp + flash_getsettings()->val.hysteresis * 10)
 
				thermostat_plant_on = 0;
 
    // EMZ FIXME: This could be way simpler
 
    if(flash_getsettings()->val.plant_type == PLANT_HEATER && runtime_status()->setpoint * 10 < temp - flash_getsettings()->val.hysteresis * 10)
 
        thermostat_plant_on = 1;
 
    else if(flash_getsettings()->val.plant_type == PLANT_HEATER && runtime_status()->setpoint * 10 > temp + flash_getsettings()->val.hysteresis * 10)
 
        thermostat_plant_on = 0;
 

	
 
			if(flash_getsettings()->val.plant_type == PLANT_COOLER && runtime_status()->setpoint * 10 > temp + flash_getsettings()->val.hysteresis * 10)
 
				thermostat_plant_on = 1;
 
			else if(flash_getsettings()->val.plant_type == PLANT_COOLER && runtime_status()->setpoint * 10 < temp - flash_getsettings()->val.hysteresis * 10)
 
				thermostat_plant_on = 0;
 
    if(flash_getsettings()->val.plant_type == PLANT_COOLER && runtime_status()->setpoint * 10 > temp + flash_getsettings()->val.hysteresis * 10)
 
        thermostat_plant_on = 1;
 
    else if(flash_getsettings()->val.plant_type == PLANT_COOLER && runtime_status()->setpoint * 10 < temp - flash_getsettings()->val.hysteresis * 10)
 
        thermostat_plant_on = 0;
 

	
 
			// EMZ: TODO: Refactor to output_enabled or something
 
			if(runtime_status()->pid_enabled && thermostat_plant_on)
 
			{
 
				// EMZ TODO: functionalize this
 
				// put ssr output on display
 
				ssd1306_drawstring("      ", 0, 90); //fixme: this is bad, but I can't get the old digits to clear otherwise
 
				char tempstr[6];
 
				itoa(ssr_output, tempstr, 10);
 
				ssd1306_drawstring(tempstr, 0, 90);
 
    // EMZ: TODO: Refactor to output_enabled or something
 
    if(runtime_status()->pid_enabled && thermostat_plant_on)
 
    {
 
        // EMZ TODO: functionalize this
 
        // put ssr output on display
 
        ssd1306_drawstring("      ", 0, 90); //fixme: this is bad, but I can't get the old digits to clear otherwise
 
        char tempstr[6];
 
        itoa(ssr_output, tempstr, 10);
 
        ssd1306_drawstring(tempstr, 0, 90);
 

	
 

	
 

	
 
//                HAL_GPIO_WritePin(SSR_PIN, 1);
 
				HAL_GPIO_WritePin(LED, 1);
 
			}
 
			else
 
			{
 
//                HAL_GPIO_WritePin(SSR_PIN, 0);
 
				HAL_GPIO_WritePin(LED, 0);
 
			}
 
        //                HAL_GPIO_WritePin(SSR_PIN, 1);
 
        HAL_GPIO_WritePin(LED, 1);
 
    }
 
    else
 
    {
 
        //                HAL_GPIO_WritePin(SSR_PIN, 0);
 
        HAL_GPIO_WritePin(LED, 0);
 
    }
 

	
 
			return ssr_output;
 
    return ssr_output;
 
}
 

	
 

	
0 comments (0 inline, 0 general)