Browse Source

before rotary code

master
Marc Poulhiès 6 years ago
parent
commit
9ef4de1d39
  1. 165
      main.c

165
main.c

@ -24,6 +24,7 @@
#include "periph/pwm.h"
static unsigned int current_pulse = 1000;
static servo_t servo1;
#define MS_TO_SERVO(x) (((unsigned long long)(x) * SERVO_RESOLUTION * SERVO_FREQUENCY)/SEC_IN_USEC)
#endif
#if ENABLE_MM5450
@ -43,7 +44,6 @@ static servo_t servo1;
#include "thread.h"
#include "msg.h"
#include "cpu.h"
#include <periph/adc.h>
#include "periph_conf.h"
@ -60,8 +60,6 @@ mm545x_t mm545p = {0};
#endif
#if ENABLE_WS2812
#include "ws2812.h"
#endif
@ -129,6 +127,9 @@ static const shell_command_t shell_commands[] = {
// ROTARY
#ifdef ENABLE_ROTARY
#include "rotary.h"
#if 0
// No complete step yet.
#define DIR_NONE 0x0
// Clockwise step.
@ -209,6 +210,8 @@ const unsigned char ttable[7][4] = {
/* {R_START_M, R_CCW_BEGIN_M, R_START_M, R_START | DIR_CCW}, */
/* }; */
#endif /* 0 */
unsigned int state = R_START;
void rotary_cb(void *unused) {
@ -248,8 +251,12 @@ void rotary_cb(void *unused) {
if(dir){
current_pulse += (dir * 10);
printf("curr %d\n", current_pulse);
if (current_pulse >= 1000 && current_pulse <= 2000)
servo_set(&servo1, current_pulse);
if (current_pulse >= 1000 && current_pulse <= 2000){
// scale back servo value in our range
unsigned long long tmp = MS_TO_SERVO(current_pulse);
printf("Scaled : %lx\n", (unsigned long)tmp);
servo_set(&servo1, tmp);
}
}
#endif
@ -360,11 +367,96 @@ void *display_thread(void *arg){
}
}
#endif
return NULL;
}
#if ENABLE_WS2812
static unsigned int ws2812_pid = KERNEL_PID_UNDEF;
char ws2812_thread_stack[THREAD_STACKSIZE_MAIN];
#define WS2812_BUTTON_STATE 0
#define WS2812_NEW_RFMSG 1
ws2812_rgb_t kit_leds [8] = {{0}};
static char big_buffer[sizeof(kit_leds)*4] = {0};
int kit_eye = 3;
void *ws2812_thread(void *arg){
msg_t msg_q[1];
int ws2812_loop_period = 1000000;
ws2812_t ws2812p;
ws2812_init(&ws2812p, WS2812_SPI_PORT );
msg_init_queue(msg_q, 1);
ws2812_pid = thread_getpid();
msg_t m;
int current_button_state = 0;
int pending_msg = 0;
while(1){
int i;
if (msg_try_receive(&m) == 1){
switch(m.type){
case WS2812_BUTTON_STATE:
if (pending_msg){
current_button_state = m.content.value;
memset(kit_leds, 0, sizeof(kit_leds));
ws2812_loop_period *= 10;
pending_msg = 0;
}
break;
case WS2812_NEW_RFMSG:
if (! pending_msg){
pending_msg = 1;
ws2812_loop_period /= 10;
}
default:
break;
}
}
if (pending_msg){
int pos = abs(kit_eye)-1;
for (i=0; i<4; i++){
kit_leds[i].b = (i == (pos %4))? 255 : 60;
kit_leds[7-i].r = (i == (pos %4))? 255 : 60 ;
}
} else {
int pos = abs(kit_eye)-1;
for (i=0; i<8; i++){
kit_leds[i].b = 255 / (1 << abs(i-pos)) ;
}
}
ws2812_write_rgb(&ws2812p, kit_leds, sizeof(kit_leds)/sizeof(ws2812_rgb_t), big_buffer);
kit_eye++;
if (kit_eye == 9){
kit_eye = -8;
} else if (kit_eye == -9){
kit_eye = 8;
} else if (kit_eye == 0){
kit_eye++;
}
xtimer_usleep(ws2812_loop_period);
}
/* while (msg_receive(&m)) { */
/* printf("ws2812_thread got a message\n"); */
/* } */
return NULL;
}
#endif /* ENABLE_WS2812 */
#ifdef ENABLE_NRF_COMM
char rx_handler_stack[THREAD_STACKSIZE_MAIN];
@ -416,6 +508,13 @@ void *nrf24l01p_rx_handler(void *arg)
#ifdef ENABLE_LCD
printf("lcd rx:%p\n", &lcd);
lcd1602d_printstr(&lcd, 0, 0, buf);
if (ws2812_pid != KERNEL_PID_UNDEF) {
msg_t m;
m.type = WS2812_NEW_RFMSG;
m.content.ptr = (char*)&frame;
msg_send_int(&m, ws2812_pid);
}
#endif
break;
@ -929,7 +1028,7 @@ int main(void)
puts("Uber\n");
#if ENABLE_SERVO
int r = servo_init(&servo1, SERVO_PWM, 0, 1000, 2000);
int r = servo_init(&servo1, SERVO_PWM, 0, MS_TO_SERVO(1000), MS_TO_SERVO(2000));
printf("servo init : %d\n", r);
#endif
@ -948,31 +1047,6 @@ int main(void)
#endif
#if ENABLE_WS2812
#define MAX_PIX_VAL 255
ws2812_rgb_t led_array[] = {
OFF,
{.r=0xff, .g=0, .b=0},
{.r=0x0, .g=0xff, .b=0},
{.r=0x0, .g=0, .b=0xff},
{.r=0xff, .g=0xff, .b=0},
{.r=0xff, .g=0xff, .b=0xff},
{.r=0xff, .g=0, .b=0},
{.r=0xff, .g=0xff, .b=0},
/* RED, GREEN, BLUE, */
/* RED, GREEN, BLUE, */
/* RED, GREEN */
};
static char big_buffer[sizeof(led_array)*4] = {0};
ws2812_rgb_t kit_leds [8] = {{0}};
int kit_eye = 3;
ws2812_t ws2812p;
ws2812_init(&ws2812p, WS2812_SPI_PORT );
#endif /* ENABLE_WS2812 */
#ifdef ENABLE_LCD
@ -1021,12 +1095,20 @@ int main(void)
int button_state = res_ladder_val(RES_LADDER_ADC, RES_LADDER_CHAN);
#endif
#if ENABLE_WS2812
if (thread_create(
ws2812_thread_stack, sizeof(ws2812_thread_stack), THREAD_PRIORITY_MAIN - 1, 0,
ws2812_thread, 0, "ws2812_thread") < 0) {
puts("Error in thread_create");
return 1;
}
#endif
// endless loop start
int loop_count=0;
while(1){
loop_count++;
#if ENABLE_WS2812
#if ENABLE_WS2812 && 0
{
int i;
int pos = abs(kit_eye)-1;
@ -1083,19 +1165,30 @@ int main(void)
int new_button_state = res_ladder_val(RES_LADDER_ADC, RES_LADDER_CHAN);
if (new_button_state != button_state){
button_state = new_button_state;
printf("%d-%d-%d-%d\n", new_button_state & 0x8 ? 1 : 0,
new_button_state & 0x4 ? 1 : 0,
new_button_state & 0x2 ? 1 : 0,
new_button_state & 0x1 ? 1 : 0);
dest = new_button_state;
if (display_pid != KERNEL_PID_UNDEF) {
dest = new_button_state & 0x7; // only 3bits
if ((new_button_state & 0x7) != (button_state & 0x7) &&
display_pid != KERNEL_PID_UNDEF) {
msg_t m;
m.type = 0;
m.content.ptr = NULL;
msg_send_int(&m, display_pid);
}
if ((new_button_state & 0x8) != (button_state & 0x8) &&
ws2812_pid != KERNEL_PID_UNDEF) {
msg_t m;
m.type = WS2812_BUTTON_STATE;
m.content.value = new_button_state & 0x8;
msg_send_int(&m, ws2812_pid);
}
button_state = new_button_state;
}
#endif
xtimer_usleep(100000/2);

Loading…
Cancel
Save