Commit a6c3cf1e authored by schneider's avatar schneider
Browse files

feat(leds): Initial SK9822 support

parent 9cab153a
This diff is collapsed.
......@@ -80,6 +80,7 @@ SRCS += font24.c
SRCS += font24CN.c
SRCS += card10.c
SRCS += display.c
SRCS += leds.c
# Where to find source files for this test
......
......@@ -42,21 +42,23 @@
/***** Includes *****/
#include "pmic.h"
#include "leds.h"
#include "card10.h"
#include "GUI_Paint.h"
#include "tmr_utils.h"
#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include <Heart.h>
/***** Definitions *****/
/***** Globals *****/
static const gpio_cfg_t motor_pin = {PORT_0, PIN_8, GPIO_FUNC_OUT, GPIO_PAD_NONE};
/***** Functions *****/
// *****************************************************************************
int main(void)
{
int count = 0;
......@@ -64,7 +66,19 @@ int main(void)
card10_init();
card10_diag();
Paint_DrawImage(Heart, 0, 0, 160, 80);
int h = 0;
while (1) {
#if 0
leds_set_hsv(0, h, 1., 1.);
leds_set_hsv(1, (h + 90) % 360, 1., 1.);
leds_set_hsv(2, (h + 180) % 360, 1., 1.);
leds_set_hsv(3, (h + 270) % 360, 1., 1.);
leds_update();
TMR_Delay(MXC_TMR0, MSEC(10), 0);
h++;
#endif
#if 1
pmic_set_led(0, 31);
pmic_set_led(1, 0);
......@@ -99,8 +113,9 @@ int main(void)
LED_On(0);
TMR_Delay(MXC_TMR0, MSEC(500), 0);
#endif
#if 1
TMR_Delay(MXC_TMR0, MSEC(1000), 0);
printf("count = %d\n", count++);
#endif
}
}
......@@ -82,6 +82,7 @@ SRCS += font24.c
SRCS += font24CN.c
SRCS += card10.c
SRCS += display.c
SRCS += leds.c
# Where to find source files for this test
......
......@@ -82,6 +82,7 @@ SRCS += font24.c
SRCS += font24CN.c
SRCS += card10.c
SRCS += display.c
SRCS += leds.c
# Where to find source files for this test
......
......@@ -80,6 +80,7 @@ SRCS += font24.c
SRCS += font24CN.c
SRCS += card10.c
SRCS += display.c
SRCS += leds.c
# Where to find source files for this test
......
......@@ -82,6 +82,7 @@ SRCS += font24.c
SRCS += font24CN.c
SRCS += card10.c
SRCS += display.c
SRCS += leds.c
# Where to find source files for this test
......
......@@ -82,6 +82,7 @@ SRCS += image.c
SRCS += image2.c
SRCS += card10.c
SRCS += display.c
SRCS += leds.c
# Where to find source files for this test
......
......@@ -7,9 +7,9 @@
#include "bme680.h"
#include "bma400.h"
#include "bhy.h"
#include "leds.h"
#include "mxc_config.h"
#include "led.h"
#include "board.h"
#include "tmr_utils.h"
......@@ -68,6 +68,8 @@ void card10_init(void)
}
display_init();
leds_init();
}
static uint32_t ecg_read_reg(uint8_t reg)
......@@ -136,9 +138,14 @@ void card10_diag(void)
printf("BMA400 found with chip ID 0x%X\r\n", bma.chip_id);
}
#if 0
for(int i=0; i<0x20; i++) {
uint32_t val = ecg_read_reg(i);
printf("ECG: %02x: 0x%06x\n", i, val);
}
#else
uint32_t val = ecg_read_reg(0xf);
printf("ECG: %02x: 0x%06x (should be 0x5139a0)\n", 0xf, val);
#endif
}
#include "gpio.h"
#include <stdint.h>
#include <string.h>
static const gpio_cfg_t rgb_dat_pin = {PORT_1, PIN_14, GPIO_FUNC_OUT, GPIO_PAD_NONE};
static const gpio_cfg_t rgb_clk_pin = {PORT_1, PIN_15, GPIO_FUNC_OUT, GPIO_PAD_NONE};
static uint8_t led_dim = 8;
static uint8_t leds[15][3];
/***** Functions *****/
// *****************************************************************************
typedef struct {
float r; // a fraction between 0 and 1
float g; // a fraction between 0 and 1
float b; // a fraction between 0 and 1
} rgb;
typedef struct {
float h; // angle in degrees
float s; // a fraction between 0 and 1
float v; // a fraction between 0 and 1
} hsv;
#if 0
static hsv rgb2hsv(rgb in)
{
hsv out;
float min, max, delta;
min = in.r < in.g ? in.r : in.g;
min = min < in.b ? min : in.b;
max = in.r > in.g ? in.r : in.g;
max = max > in.b ? max : in.b;
out.v = max; // v
delta = max - min;
if (delta < 0.00001)
{
out.s = 0;
out.h = 0; // undefined, maybe nan?
return out;
}
if( max > 0.0 ) { // NOTE: if Max is == 0, this divide would cause a crash
out.s = (delta / max); // s
} else {
// if max is 0, then r = g = b = 0
// s = 0, h is undefined
out.s = 0.0;
out.h = 0.0; // its now undefined
return out;
}
if( in.r >= max ) // > is bogus, just keeps compilor happy
out.h = ( in.g - in.b ) / delta; // between yellow & magenta
else
if( in.g >= max )
out.h = 2.0 + ( in.b - in.r ) / delta; // between cyan & yellow
else
out.h = 4.0 + ( in.r - in.g ) / delta; // between magenta & cyan
out.h *= 60.0; // degrees
if( out.h < 0.0 )
out.h += 360.0;
return out;
}
#endif
static rgb hsv2rgb(hsv in)
{
float hh, p, q, t, ff;
long i;
rgb out;
if(in.s <= 0.0) { // < is bogus, just shuts up warnings
out.r = in.v;
out.g = in.v;
out.b = in.v;
return out;
}
hh = in.h;
if(hh >= 360.0) hh = 0.0;
hh /= 60.0;
i = (long)hh;
ff = hh - i;
p = in.v * (1.0 - in.s);
q = in.v * (1.0 - (in.s * ff));
t = in.v * (1.0 - (in.s * (1.0 - ff)));
switch(i) {
case 0:
out.r = in.v;
out.g = t;
out.b = p;
break;
case 1:
out.r = q;
out.g = in.v;
out.b = p;
break;
case 2:
out.r = p;
out.g = in.v;
out.b = t;
break;
case 3:
out.r = p;
out.g = q;
out.b = in.v;
break;
case 4:
out.r = t;
out.g = p;
out.b = in.v;
break;
case 5:
default:
out.r = in.v;
out.g = p;
out.b = q;
break;
}
return out;
}
static void shift(uint8_t data)
{
for(int i=0; i<8; i++) {
if(data & 0x80) {
GPIO_OutSet(&rgb_dat_pin);
}else{
GPIO_OutClr(&rgb_dat_pin);
}
GPIO_OutClr(&rgb_clk_pin);
//TMR_Delay(MXC_TMR0, MSEC(1), 0);
GPIO_OutSet(&rgb_clk_pin);
//TMR_Delay(MXC_TMR0, MSEC(1), 0);
data <<= 1;
}
}
static void leds_start(void)
{
shift(0x00); shift(0x00); shift(0x00); shift(0x00);
}
static void leds_shift(uint8_t r, uint8_t g, uint8_t b, uint8_t dim)
{
shift(0xE0 | (dim & 0x1F)); shift(b); shift(g); shift(r);
}
static void leds_stop(void)
{
shift(0xFF); shift(0xFF); shift(0xFF); shift(0xFF);
}
void leds_set_dim(uint8_t dim)
{
led_dim = dim;
}
void leds_set(uint8_t led, uint8_t r, uint8_t g, uint8_t b)
{
leds[led][0] = r;
leds[led][1] = g;
leds[led][2] = b;
}
void leds_set_hsv(uint8_t led, float h, float s, float v)
{
hsv in = {h, s, v};
rgb out = hsv2rgb(in);
leds[led][0] = out.r * 255;
leds[led][1] = out.g * 255;
leds[led][2] = out.b * 255;
}
void leds_update(void)
{
leds_start();
for(int i=3; i>=0; i--) {
leds_shift(leds[i][0], leds[i][1], leds[i][2], led_dim);
}
leds_stop();
}
void leds_init(void)
{
GPIO_Config(&rgb_clk_pin);
GPIO_Config(&rgb_dat_pin);
GPIO_OutSet(&rgb_clk_pin);
GPIO_OutClr(&rgb_dat_pin);
memset(leds, 0, sizeof(leds));
led_dim = 8;
leds_update();
}
#ifndef LED_H
#include <stdint.h>
void leds_set_dim(uint8_t dim);
void leds_set(uint8_t led, uint8_t r, uint8_t g, uint8_t b);
void leds_set_hsv(uint8_t led, float h, float s, float v);
void leds_update(void);
void leds_init(void);
#endif
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment