return (p[1] << 8) | p[0];
}
+static inline uint get_u16_be(byte *p)
+{
+ return (p[0] << 8) | p[1];
+}
+
+static inline uint get_u32_le(byte *p)
+{
+ return (p[3] << 24) | (p[2] << 16) | (p[1] << 8) | p[0];
+}
+
+static inline uint get_u32_be(byte *p)
+{
+ return (p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3];
+}
+
static inline void put_u16_le(byte *p, u16 x)
{
p[0] = x;
p[3] = x & 0xff;
}
+static inline void put_u32_le(byte *p, u32 x)
+{
+ p[3] = x >> 24;
+ p[2] = (x >> 16) & 0xff;
+ p[1] = (x >> 8) & 0xff;
+ p[0] = x & 0xff;
+}
+
// debug.c
#undef DEBUG_SEMIHOSTING
-#define DEBUG_USART USART1
+// #define DEBUG_USART USART1
+#undef DEBUG_USART
void debug_printf(const char *fmt, ...);
void debug_puts(const char *s);
/* Private variables ---------------------------------------------------------*/
PCD_HandleTypeDef hpcd_USB_FS;
+volatile byte led_trigger;
/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
+static void process_packet(void)
+{
+ uint cmd = get_u32_be(rx_packet);
+ uint arg = get_u32_be(rx_packet+4);
+ debug_printf("<< cmd %08x %08x\n", cmd, arg);
+
+ memset(tx_packet, 0, sizeof(tx_packet));
+ put_u32_be(tx_packet, 1);
+
+ switch (cmd)
+ {
+ case 1:
+ if (arg < 16)
+ {
+ if (arg & 1)
+ LL_GPIO_ResetOutputPin(SSR1_GPIO_Port, SSR1_Pin);
+ else
+ LL_GPIO_SetOutputPin(SSR1_GPIO_Port, SSR1_Pin);
+ if (arg & 2)
+ LL_GPIO_ResetOutputPin(SSR2_GPIO_Port, SSR2_Pin);
+ else
+ LL_GPIO_SetOutputPin(SSR2_GPIO_Port, SSR2_Pin);
+ if (arg & 4)
+ LL_GPIO_ResetOutputPin(SSR3_GPIO_Port, SSR3_Pin);
+ else
+ LL_GPIO_SetOutputPin(SSR3_GPIO_Port, SSR3_Pin);
+ if (arg & 8)
+ LL_GPIO_ResetOutputPin(SSR4_GPIO_Port, SSR4_Pin);
+ else
+ LL_GPIO_SetOutputPin(SSR4_GPIO_Port, SSR4_Pin);
+ put_u32_be(tx_packet, 0);
+ }
+ break;
+ }
+
+ debug_printf(">> status %08x\n", get_u32_be(tx_packet));
+}
+
/* USER CODE END 0 */
/**
/* USER CODE BEGIN WHILE */
while (1)
{
- static byte led_state;
- if (led_state)
+ if (led_trigger)
{
- LL_GPIO_SetOutputPin(LED_GPIO_Port, LED_Pin);
- LL_GPIO_SetOutputPin(SSR1_GPIO_Port, SSR1_Pin);
- LL_GPIO_SetOutputPin(SSR2_GPIO_Port, SSR2_Pin);
- LL_GPIO_SetOutputPin(SSR3_GPIO_Port, SSR3_Pin);
- LL_GPIO_SetOutputPin(SSR4_GPIO_Port, SSR4_Pin);
- }
- else
- {
- LL_GPIO_ResetOutputPin(LED_GPIO_Port, LED_Pin);
- static byte xxx;
- switch (xxx)
- {
- case 0:
- LL_GPIO_ResetOutputPin(SSR1_GPIO_Port, SSR1_Pin);
- break;
- case 1:
- LL_GPIO_ResetOutputPin(SSR2_GPIO_Port, SSR2_Pin);
- break;
- case 2:
- LL_GPIO_ResetOutputPin(SSR3_GPIO_Port, SSR3_Pin);
- break;
- case 3:
- LL_GPIO_ResetOutputPin(SSR4_GPIO_Port, SSR4_Pin);
- break;
- }
- xxx = (xxx+1) % 4;
+ led_trigger = 0;
+ static byte led_state;
+ if (led_state)
+ LL_GPIO_SetOutputPin(LED_GPIO_Port, LED_Pin);
+ else
+ LL_GPIO_ResetOutputPin(LED_GPIO_Port, LED_Pin);
+ led_state ^= 1;
}
- led_state ^= 1;
if (rx_packet_state == 1 && !tx_packet_state)
{
tx_packet_state = 1;
- put_u32_be(tx_packet, 42);
+ process_packet();
usb_ep_send(&usb, 0x82, tx_packet, 12);
rx_packet_state = 0;
usb_ep_receive(&usb, 0x01, rx_packet, 64);
}
+#if 0
static int cnt;
debug_printf("Counter = %d\n", cnt);
cnt++;
+#endif
- //__WFI();
- LL_mDelay(1000);
+ __WFI();
+ // LL_mDelay(1000);
/* USER CODE END WHILE */
libusb_device *dev = devlist[i];
if (!libusb_get_device_descriptor(dev, &desc))
{
- if (desc.idVendor == 0x4242 && desc.idProduct == 0x0001)
+ if (desc.idVendor == 0x4242 && desc.idProduct == 0x0002)
{
printf("Found device at usb%d.%d\n", libusb_get_bus_number(dev), libusb_get_device_address(dev));
// FIXME: Free device list
exit(1);
}
+ uint tst = 0;
+
for (;;)
{
- time_t t = time(NULL);
- struct tm *tm = localtime(&t);
+ byte req[8];
+ put_u32_be(req, 1);
+ put_u32_be(req+4, (1 << tst));
+ tst = (tst+1) % 4;
- unsigned char req[8] = {
- tm->tm_hour / 10,
- tm->tm_hour % 10,
- (tm->tm_sec % 2 ? 10 : 0xff),
- tm->tm_min / 10,
- tm->tm_min % 10,
- };
int transferred;
if (err = libusb_bulk_transfer(devh, 0x01, req, 8, &transferred, 2000))
die("Transfer failed: error %d\n", err);
if (err = libusb_bulk_transfer(devh, 0x82, resp, 64, &received, 2000))
die("Receive failed: error %d\n", err);
// printf("Received %d bytes\n", received);
- if (received >= 12)
+
+ if (received >= 4)
{
- int t = get_u32_be(resp);
- int p = get_u32_be(resp + 4);
- uint cnt = get_u32_be(resp + 8);
- msg(L_INFO, "Temperature %d ddegC, pressure %d Pa, cnt %u", t, p, cnt);
+ int status = get_u32_be(resp);
+ if (status)
+ msg(L_ERROR, "Received error status %08x", status);
}
+ else
+ msg(L_ERROR, "Received short packet");
sleep(1);
}