--- /dev/null
+export BOARD = stm32f429discovery
+ROOTDIR = $(CURDIR)/uC-sdk
+
+ifeq ($(wildcard $(ROOTDIR)/uC-sdk.root),)
+ifneq ($(wildcard ../../../uC-sdk.root),)
+ROOTDIR = ../../..
+endif
+endif
+
+TARGET = forcefader.bin
+TARGET_SRCS = forcefader.c
+
+LIBDEPS = \
+$(ROOTDIR)/FreeRTOS/libFreeRTOS.a \
+$(ROOTDIR)/arch/libarch.a \
+$(ROOTDIR)/os/libos.a \
+$(ROOTDIR)/libc/libc.a \
+$(ROOTDIR)/libm/libm.a \
+$(ROOTDIR)/acorn/libacorn.a \
+$(ROOTDIR)/hardware/libhardware.a \
+
+LIBS = -Wl,--start-group $(LIBDEPS) -Wl,--end-group
+TARGET_INCLUDES = include
+
+include $(ROOTDIR)/common.mk
+
+all: uC-sdk $(TARGET)
+
+clean: clean-generic
+ $(Q)$(MAKE) $(MAKE_OPTS) -C $(ROOTDIR) clean
+
+.PHONY: uC-sdk
+
+$(ROOTDIR)/FreeRTOS/libFreeRTOS.a: uC-sdk
+$(ROOTDIR)/arch/libarch.a: uC-sdk
+$(ROOTDIR)/os/libos.a: uC-sdk
+$(ROOTDIR)/libc/libc.a: uC-sdk
+$(ROOTDIR)/libm/libm.a: uC-sdk
+$(ROOTDIR)/acorn/libacorn.a: uC-sdk
+$(ROOTDIR)/hardware/libhardware.a: uC-sdk
+
+uC-sdk:
+ $(E) "[MAKE] Entering uC-sdk"
+ $(Q)$(MAKE) $(MAKE_OPTS) -C $(ROOTDIR)
+
+deps: ldeps
+ $(E) "[DEPS] Creating dependency tree for uC-sdk"
+ $(Q)$(MAKE) $(MAKE_OPTS) -C $(ROOTDIR) ldeps
+
+include $(ROOTDIR)/FreeRTOS/config.mk
+include $(ROOTDIR)/arch/config.mk
+include $(ROOTDIR)/os/config.mk
+include $(ROOTDIR)/libc/config.mk
+include $(ROOTDIR)/libm/config.mk
+include $(ROOTDIR)/acorn/config.mk
+include $(ROOTDIR)/hardware/config.mk
+include $(ROOTDIR)/target-rules.mk
+
--- /dev/null
+#include <gpio.h>
+#include <adc.h>
+#include <timer.h>
+#include <stdio.h>
+
+#define POSMIN 0
+#define POSMAX 4095
+
+#define THRESHOLD 90
+
+uint16_t faderpos;
+pin_t faderpos_pin, motorsignal_pin, motordir1_pin, motordir2_pin, fadertouch_pin, touch_TX_pin, touch_RX_pin;
+
+timer_channel_t forceloop_timer = { .timer = 1, .channel = 1 };
+timer_channel_t capacitiveloop_timer = { .timer = 2, .channel = 1 };
+timer_channel_t motorsignal_timer = { .timer = 3, .channel = 3 };
+timer_channel_t capacitivemeasure_timer = { .timer = 4, .channel = 1 };
+
+uint16_t capacitance = 0;
+
+void setSpringForce(uint16_t pos, uint8_t k)
+{
+ uint32_t force;
+ if (faderpos > pos)
+ {
+ gpio_set(motordir1_pin, 0);
+ gpio_set(motordir2_pin, 1);
+ force = ((uint32_t)(faderpos - pos) * k) / 4096;
+ }
+ else
+ {
+ gpio_set(motordir1_pin, 1);
+ gpio_set(motordir2_pin, 0);
+ force = ((uint32_t)(pos - faderpos) * k) / 4096;
+ }
+ //printf("force 1: %8d\n", force);
+ timer_pwmchannel_init(motorsignal_timer, motorsignal_pin, force);
+}
+
+void updateForce()
+{
+ if (capacitance > THRESHOLD)
+ setSpringForce(2048, 255);
+}
+
+uint8_t measuring = 0;
+
+void capacitiveRX()
+{
+ if (measuring)
+ {
+ capacitance = timer_get_count(timer_4);
+ //printf("capa : %8d\n", c);
+ gpio_set(touch_TX_pin, 0);
+ measuring = 0;
+ }
+}
+
+void capacitiveTimeout()
+{
+ if (measuring)
+ {
+ capacitance = 0xffff;
+ //printf("capa : timeout\n");
+ gpio_set(touch_TX_pin, 0);
+ measuring = 0;
+ }
+}
+
+void capacitiveTX()
+{
+ if (!measuring)
+ {
+ timer_set_count(timer_4, 0);
+ gpio_set(touch_TX_pin, 1);
+ measuring = 1;
+ }
+}
+
+int main()
+{
+ faderpos_pin = make_pin(gpio_port_a, 0); //ADC1 CH0
+ motorsignal_pin = make_pin(gpio_port_b, 0); //TIMER3 CH3
+ motordir1_pin = make_pin(gpio_port_e, 6);
+ motordir2_pin = make_pin(gpio_port_f, 4);
+ touch_TX_pin = make_pin(gpio_port_c, 12);
+ touch_RX_pin = make_pin(gpio_port_g, 11);
+
+ faderpos = 0;
+ uint8_t channel = 0;
+ adc_config_continuous(adc_1, &channel, &faderpos_pin, &faderpos, 1);
+
+ gpio_config(motordir1_pin, pin_dir_write, pull_none);
+ gpio_config(motordir2_pin, pin_dir_write, pull_none);
+
+ gpio_config(touch_TX_pin, pin_dir_write, pull_down);
+ gpio_config(touch_RX_pin, pin_dir_read, pull_none);
+ gpio_set(touch_TX_pin, 0);
+
+ //compute new force
+ timer_config(timer_1, 42, 1000);
+ timer_irq_init(forceloop_timer, event_update, updateForce);
+
+ //start capacitive measure
+ timer_config(timer_2, 1050, 1000);
+ timer_irq_init(capacitiveloop_timer, event_update, capacitiveTX);
+
+ //motor amplitude
+ timer_config(timer_3, 8, 255);
+ timer_pwmchannel_init(motorsignal_timer, motorsignal_pin, 0);
+
+ //capacitive counter
+ timer_config(timer_4, 84, 4000);
+ //timer_disable(timer_4);
+ timer_irq_init(capacitivemeasure_timer, event_update, capacitiveTimeout);
+
+ gpio_irq_init(touch_RX_pin, capacitiveRX, rising);
+
+ //Loop
+ while (1);
+ //printf("pos : %4d\n", faderpos);
+
+ return 0;
+}