12 changed files with 1550 additions and 788 deletions
@ -0,0 +1,16 @@
@@ -0,0 +1,16 @@
|
||||
/*
|
||||
* usb_parsing.h |
||||
* |
||||
* The MIT License. |
||||
* Created on: 15.11.2018 |
||||
* Author: Mateusz Salamon |
||||
* www.msalamon.pl |
||||
* mateusz@msalamon.pl |
||||
*/ |
||||
|
||||
#ifndef USB_PARSING_H_ |
||||
#define USB_PARSING_H_ |
||||
|
||||
void USB_Parsing(void); |
||||
|
||||
#endif /* USB_PARSING_H_ */ |
@ -0,0 +1,313 @@
@@ -0,0 +1,313 @@
|
||||
/*
|
||||
* usb_parsing.c |
||||
* |
||||
* The MIT License. |
||||
* Created on: 15.11.2018 |
||||
* Author: Mateusz Salamon |
||||
* www.msalamon.pl |
||||
* mateusz@msalamon.pl |
||||
*/ |
||||
|
||||
#include "stm32f1xx_hal.h" |
||||
#include "usbd_cdc_if.h" |
||||
#include <stdlib.h> |
||||
#include <string.h> |
||||
|
||||
#include "ws2812b.h" |
||||
#include "ws2812b_fx.h" |
||||
#include "usb_parsing.h" |
||||
|
||||
uint8_t USBDataRX[40]; // Array for receive USB messages
|
||||
uint8_t USBReceivedDataFlag; // Received USB data flag
|
||||
uint8_t USBDataTX[40]; // Array for transmission USB messages
|
||||
uint8_t USBDataLength; // USB message length
|
||||
|
||||
void UnknownCommand(void) |
||||
{ |
||||
USBDataLength = sprintf((char*)USBDataTX, "Unknown command\n\r"); |
||||
} |
||||
|
||||
void ColorControl(void) |
||||
{ |
||||
char *buf; |
||||
int16_t Seg; |
||||
uint8_t Color[3]; |
||||
|
||||
if((buf = strtok((char*)USBDataRX+1, ","))) // Segment number
|
||||
{ |
||||
Seg = atoi(buf); |
||||
|
||||
for(uint8_t i = 0; i < 3; i++) |
||||
{ |
||||
if((buf = strtok(NULL, ","))) // Speed
|
||||
{ |
||||
Color[i] = atoi(buf); |
||||
} |
||||
else |
||||
{ |
||||
USBDataLength = sprintf((char*)USBDataTX, "Color command error\n\r"); |
||||
return; |
||||
} |
||||
} |
||||
|
||||
WS2812BFX_SetColorRGB(Seg, Color[0], Color[1], Color[2]); |
||||
USBDataLength = sprintf((char*)USBDataTX, "ColorID:%d Value:%dR, %dG, %dB\n\r", Seg, Color[0], Color[1], Color[2]); |
||||
return; |
||||
} |
||||
USBDataLength = sprintf((char*)USBDataTX, "Color command error\n\r"); |
||||
} |
||||
|
||||
void SpeedControl(void) |
||||
{ |
||||
char *buf; |
||||
int16_t Seg; |
||||
uint16_t Speed; |
||||
|
||||
if((buf = strtok((char*)USBDataRX+1, ","))) // Segment number
|
||||
{ |
||||
Seg = atoi(buf); |
||||
|
||||
if((buf = strtok(NULL, ","))) // Speed
|
||||
{ |
||||
if((Speed = atoi(buf)) > 0) |
||||
{ |
||||
WS2812BFX_SetSpeed(Seg, Speed); |
||||
USBDataLength = sprintf((char*)USBDataTX, "Segment:%d Speed:%d\n\r", Seg, Speed); |
||||
return; |
||||
} |
||||
} |
||||
} |
||||
USBDataLength = sprintf((char*)USBDataTX, "Speed command error\n\r"); |
||||
} |
||||
|
||||
void ModeControl(void) |
||||
{ |
||||
char *buf; |
||||
int16_t Seg; |
||||
int16_t Mode; |
||||
|
||||
buf = strtok((char*)USBDataRX+1, ","); // Segment number
|
||||
Seg = atoi(buf); |
||||
|
||||
if((buf = strtok(NULL, ","))) |
||||
{ |
||||
if(buf[0] == 'S') |
||||
{ |
||||
WS2812BFX_Start(Seg); |
||||
USBDataLength = sprintf((char*)USBDataTX, "Segment:%d Start\n\r", Seg); |
||||
return; |
||||
} |
||||
else if(buf[0] == 'T') |
||||
{ |
||||
WS2812BFX_Stop(Seg); |
||||
USBDataLength = sprintf((char*)USBDataTX, "Segment:%d Stop\n\r", Seg); |
||||
return; |
||||
} |
||||
else // Mode
|
||||
{ |
||||
if((Mode = atoi(buf)) > 0) |
||||
{ |
||||
WS2812BFX_SetMode(Seg, Mode); |
||||
|
||||
USBDataLength = sprintf((char*)USBDataTX, "Segment:%d Mode:%d\n\r", Seg, Mode); |
||||
return; |
||||
} |
||||
} |
||||
} |
||||
USBDataLength = sprintf((char*)USBDataTX, "mode command error\n\r"); |
||||
} |
||||
|
||||
void SegmentsControl(void) |
||||
{ |
||||
int16_t Seg; |
||||
uint8_t mode_tmp; |
||||
if(USBDataRX[1] == '-') |
||||
{ |
||||
WS2812BFX_SegmentDecrease(); |
||||
} |
||||
else if(USBDataRX[1] == '+') |
||||
{ |
||||
WS2812BFX_SegmentIncrease(); |
||||
WS2812BFX_SetMode(WS2812BFX_GetSegmentsQuantity() - 1, rand()%MODE_COUNT); |
||||
WS2812BFX_Start(WS2812BFX_GetSegmentsQuantity() - 1); |
||||
} |
||||
else if((Seg = atoi((char*)(USBDataRX+1))) > 0) |
||||
{ |
||||
WS2812BFX_Init(Seg); |
||||
} |
||||
else |
||||
{ |
||||
USBDataLength = sprintf((char*)USBDataTX, "Segment command error\n\r"); |
||||
return; |
||||
} |
||||
WS2812BFX_GetMode(WS2812BFX_GetSegmentsQuantity()-1, &mode_tmp); |
||||
USBDataLength = sprintf((char*)USBDataTX, "Segments:%d Last mode:%d\n\r", WS2812BFX_GetSegmentsQuantity(), mode_tmp); |
||||
} |
||||
|
||||
void SegmentRangeControl(void) |
||||
{ |
||||
char *buf; |
||||
int16_t Seg; |
||||
int16_t Start; |
||||
int16_t End; |
||||
|
||||
buf = strtok((char*)USBDataRX+1, ","); // Segment number
|
||||
Seg = atoi(buf); |
||||
|
||||
if((buf = strtok(NULL, ","))) |
||||
{ |
||||
if(buf[0] == 'R') // Range (Stanrt and Stop)
|
||||
{ |
||||
if((buf = strtok(NULL, ","))) // Speed
|
||||
{ |
||||
if((Start = atoi(buf)) > 0) |
||||
{ |
||||
if((buf = strtok(NULL, ","))) // Speed
|
||||
{ |
||||
if((End = atoi(buf)) > 0) |
||||
{ |
||||
WS2812BFX_SetSegmentSize(Seg, Start, End); |
||||
USBDataLength = sprintf((char*)USBDataTX, "Segment:%d Range:%d - %d\n\r", Seg, Start, End); |
||||
return; |
||||
} |
||||
else |
||||
USBDataLength = sprintf((char*)USBDataTX, "Segment range End error\n\r"); |
||||
return; |
||||
} |
||||
} |
||||
else |
||||
USBDataLength = sprintf((char*)USBDataTX, "Segment range Start error\n\r"); |
||||
return; |
||||
} |
||||
} |
||||
else if(buf[0] == 'S') //Start
|
||||
{ |
||||
if(buf[1] == '+') |
||||
{ |
||||
WS2812BFX_SegmentIncreaseStart(Seg); |
||||
USBDataLength = sprintf((char*)USBDataTX, "Segment:%d Start increase\n\r", Seg); |
||||
return; |
||||
} |
||||
if(buf[1] == '-') |
||||
{ |
||||
WS2812BFX_SegmentDecreaseStart(Seg); |
||||
USBDataLength = sprintf((char*)USBDataTX, "Segment:%d Start decrease\n\r", Seg); |
||||
return; |
||||
} |
||||
|
||||
} |
||||
else if(buf[0] == 'E') //END
|
||||
{ |
||||
if(buf[1] == '+') |
||||
{ |
||||
WS2812BFX_SegmentIncreaseEnd(Seg); |
||||
USBDataLength = sprintf((char*)USBDataTX, "Segment:%d End increase\n\r", Seg); |
||||
return; |
||||
} |
||||
if(buf[1] == '-') |
||||
{ |
||||
WS2812BFX_SegmentDecreaseEnd(Seg); |
||||
USBDataLength = sprintf((char*)USBDataTX, "Segment:%d End decrease\n\r", Seg); |
||||
return; |
||||
} |
||||
} |
||||
} |
||||
USBDataLength = sprintf((char*)USBDataTX, "Segment range command error\n\r"); |
||||
} |
||||
|
||||
void PrintHelp(void) |
||||
{ |
||||
|
||||
USBDataLength = sprintf((char*)USBDataTX, "\033[2J\033[0;0H"); |
||||
while(USBD_BUSY == CDC_Transmit_FS(USBDataTX, USBDataLength)); |
||||
USBDataLength = sprintf((char*)USBDataTX, "==============HELP=============\n\r"); |
||||
while(USBD_BUSY == CDC_Transmit_FS(USBDataTX, USBDataLength)); |
||||
USBDataLength = sprintf((char*)USBDataTX, "Change Segments quantity:\n\r"); |
||||
while(USBD_BUSY == CDC_Transmit_FS(USBDataTX, USBDataLength)); |
||||
USBDataLength = sprintf((char*)USBDataTX, " 'Sx' Set x segments(1 - LEDs/2)\n\r"); |
||||
while(USBD_BUSY == CDC_Transmit_FS(USBDataTX, USBDataLength)); |
||||
USBDataLength = sprintf((char*)USBDataTX, " 'S+' add one segment\n\r"); |
||||
while(USBD_BUSY == CDC_Transmit_FS(USBDataTX, USBDataLength)); |
||||
USBDataLength = sprintf((char*)USBDataTX, " 'S-' remove one segment\n\r"); |
||||
while(USBD_BUSY == CDC_Transmit_FS(USBDataTX, USBDataLength)); |
||||
USBDataLength = sprintf((char*)USBDataTX, "Change Segments length:\n\r"); |
||||
while(USBD_BUSY == CDC_Transmit_FS(USBDataTX, USBDataLength)); |
||||
USBDataLength = sprintf((char*)USBDataTX, " 'Rx,S+' Increase start point x "); |
||||
while(USBD_BUSY == CDC_Transmit_FS(USBDataTX, USBDataLength)); |
||||
USBDataLength = sprintf((char*)USBDataTX, "segment\n\r"); |
||||
while(USBD_BUSY == CDC_Transmit_FS(USBDataTX, USBDataLength)); |
||||
USBDataLength = sprintf((char*)USBDataTX, " 'Rx,S-' Decrease start point x "); |
||||
while(USBD_BUSY == CDC_Transmit_FS(USBDataTX, USBDataLength)); |
||||
USBDataLength = sprintf((char*)USBDataTX, "segment\n\r"); |
||||
while(USBD_BUSY == CDC_Transmit_FS(USBDataTX, USBDataLength)); |
||||
USBDataLength = sprintf((char*)USBDataTX, " 'Rx,E+' Increase end point x "); |
||||
while(USBD_BUSY == CDC_Transmit_FS(USBDataTX, USBDataLength)); |
||||
USBDataLength = sprintf((char*)USBDataTX, "segment\n\r"); |
||||
while(USBD_BUSY == CDC_Transmit_FS(USBDataTX, USBDataLength)); |
||||
USBDataLength = sprintf((char*)USBDataTX, " 'Rx,E-' Decrease end point x "); |
||||
while(USBD_BUSY == CDC_Transmit_FS(USBDataTX, USBDataLength)); |
||||
USBDataLength = sprintf((char*)USBDataTX, "segment\n\r"); |
||||
while(USBD_BUSY == CDC_Transmit_FS(USBDataTX, USBDataLength)); |
||||
USBDataLength = sprintf((char*)USBDataTX, " 'Rx,R,y,z' Set start(y) and stop(z) po"); |
||||
while(USBD_BUSY == CDC_Transmit_FS(USBDataTX, USBDataLength)); |
||||
USBDataLength = sprintf((char*)USBDataTX, "int x segment\n\r"); |
||||
while(USBD_BUSY == CDC_Transmit_FS(USBDataTX, USBDataLength)); |
||||
USBDataLength = sprintf((char*)USBDataTX, "Change segment's mode:\n\r"); |
||||
while(USBD_BUSY == CDC_Transmit_FS(USBDataTX, USBDataLength)); |
||||
USBDataLength = sprintf((char*)USBDataTX, " 'Mx,S' Start segment x\n\r"); |
||||
while(USBD_BUSY == CDC_Transmit_FS(USBDataTX, USBDataLength)); |
||||
USBDataLength = sprintf((char*)USBDataTX, " 'Mx,T' Stop segment x\n\r"); |
||||
while(USBD_BUSY == CDC_Transmit_FS(USBDataTX, USBDataLength)); |
||||
USBDataLength = sprintf((char*)USBDataTX, " 'Mx,y' Set y mode for x segment\n\r"); |
||||
while(USBD_BUSY == CDC_Transmit_FS(USBDataTX, USBDataLength)); |
||||
USBDataLength = sprintf((char*)USBDataTX, "Change segment's speed:\n\r"); |
||||
while(USBD_BUSY == CDC_Transmit_FS(USBDataTX, USBDataLength)); |
||||
USBDataLength = sprintf((char*)USBDataTX, " 'Vx,y' Set y speed for x segment\n\r"); |
||||
while(USBD_BUSY == CDC_Transmit_FS(USBDataTX, USBDataLength)); |
||||
USBDataLength = sprintf((char*)USBDataTX, "Set color:\n\r"); |
||||
while(USBD_BUSY == CDC_Transmit_FS(USBDataTX, USBDataLength)); |
||||
USBDataLength = sprintf((char*)USBDataTX, " 'Cx,r,g,b' x - ColorID, rgb values\n\r"); |
||||
while(USBD_BUSY == CDC_Transmit_FS(USBDataTX, USBDataLength)); |
||||
USBDataLength = sprintf((char*)USBDataTX, "===============================\n\r"); |
||||
while(USBD_BUSY == CDC_Transmit_FS(USBDataTX, USBDataLength)); |
||||
} |
||||
|
||||
void USB_Parsing(void) |
||||
{ |
||||
if(USBReceivedDataFlag == 1) |
||||
{ |
||||
USBReceivedDataFlag = 0; |
||||
|
||||
switch (USBDataRX[0]) |
||||
{ |
||||
case 'C': |
||||
ColorControl(); |
||||
break; |
||||
|
||||
case 'V': |
||||
SpeedControl(); |
||||
break; |
||||
|
||||
case 'M': |
||||
ModeControl(); |
||||
break; |
||||
|
||||
case 'S': |
||||
SegmentsControl(); |
||||
break; |
||||
|
||||
case 'R': |
||||
SegmentRangeControl(); |
||||
break; |
||||
|
||||
case 'H': |
||||
PrintHelp(); |
||||
break; |
||||
default: |
||||
UnknownCommand(); |
||||
break; |
||||
} |
||||
|
||||
CDC_Transmit_FS(USBDataTX, USBDataLength); // Send confirmation message
|
||||
} |
||||
} |
Loading…
Reference in new issue