diff --git a/Application/Tasks/CMakeLists.txt b/Application/Tasks/CMakeLists.txt index d9ca746..18c8323 100644 --- a/Application/Tasks/CMakeLists.txt +++ b/Application/Tasks/CMakeLists.txt @@ -12,6 +12,8 @@ target_sources(${PROJECT_NAME} ${CMAKE_CURRENT_LIST_DIR}/FirmwareUpdate.c ${CMAKE_CURRENT_LIST_DIR}/LightTask.c ${CMAKE_CURRENT_LIST_DIR}/LightState.c + ${CMAKE_CURRENT_LIST_DIR}/Headlight_can.c + INTERFACE ${CMAKE_CURRENT_LIST_DIR}/UsbDataHandler.h ${CMAKE_CURRENT_LIST_DIR}/CanDataTask.h diff --git a/Application/Tasks/Headlight_can.c b/Application/Tasks/Headlight_can.c new file mode 100644 index 0000000..8bac6d9 --- /dev/null +++ b/Application/Tasks/Headlight_can.c @@ -0,0 +1,84 @@ + +#include "UsbDataHandler.h" +#include "headlight.pb.h" +#include "CanDataHandler.h" +#include "stdint.h" +#include "cmsis_os2.h" +#include "CLS.h" +#include "CLS_BSP.h" +#include "CLSAddress.h" + + +cls_headlight_RequestSettings msg_cls_headlight_RequestSettings; +cls_headlight_Settings msg_cls_headlight_Settings; +cls_headlight_SaveSettings msg_cls_headlight_SaveSettings; + + +typedef struct Headlight_Control_Setting { + float alpha; + uint16_t on_threshold; + uint16_t off_threshold; +} Headlight_Control_Setting_t; + +void DataClbk_cls_headlight_Settings(void* msg, uint32_t length) { + DATA_CLBK_SETUP(cls_headlight_Settings); + uint8_t device = msg_cls_headlight_Settings.deviceId; + + uint16_t msg_light_setting = GENERATE_CLS_ADDRESS(CLS_CODE_CONFIG, device, 0); + CLS_BSP_TxHeaderType can_header = CREATE_BSP_CAN_HEADER(msg_light_setting, CLS_BSP_DLC_BYTES_8); + + + Headlight_Control_Setting_t data = {0}; + data.alpha = msg_cls_headlight_Settings.alpha; + data.on_threshold = msg_cls_headlight_Settings.on_threshold; + data.off_threshold = msg_cls_headlight_Settings.off_threshold; + + CLS_BSP_CAN_AddMessageToSend(&can_header, (uint8_t*)&data); +} + + +void DataClbk_cls_headlight_SaveSettings(void* msg, uint32_t length) { + DATA_CLBK_SETUP(cls_headlight_SaveSettings); + + uint8_t device = msg_cls_headlight_SaveSettings.deviceId; + uint16_t msg_light_setting = GENERATE_CLS_ADDRESS(CLS_CODE_CONFIG, device, 4); + CLS_BSP_TxHeaderType can_header = CREATE_BSP_CAN_HEADER(msg_light_setting, CLS_BSP_DLC_BYTES_1); + CLS_BSP_CAN_AddMessageToSend(&can_header, (uint8_t*)"X"); +} + + + +static Headlight_Control_Setting_t response_theme = {0}; +static cls_headlight_Settings headligh_settings = {0}; +void CanData_responseHeadlightSetting(CanDataId canid, uint8_t* data, uint8_t len) { + if(len == 8) { + memcpy(&response_theme, data, 8); + + headligh_settings.alpha = response_theme.alpha; + headligh_settings.on_threshold = response_theme.on_threshold; + headligh_settings.off_threshold = response_theme.off_threshold; + headligh_settings.deviceId = (canid >> 3) & 0x1F; + + + USBDataResonse(&headligh_settings,cls_headlight_Settings_fields, cls_usb_PackageType_HEADLIGHT_SETTINGS); + } + + CanData_removeEvent(canid); +} + + + +void DataClbk_cls_headlight_RequestSettings(void* msg, uint32_t length) { + DATA_CLBK_SETUP(cls_headlight_RequestSettings); + uint8_t device = msg_cls_headlight_RequestSettings.deviceId; + uint8_t data = 0; + + uint16_t msg_light_setting = GENERATE_CLS_ADDRESS(CLS_CODE_CONFIG, device, 7); + CLS_BSP_TxHeaderType can_header = CREATE_BSP_CAN_HEADER(msg_light_setting, CLS_BSP_DLC_BYTES_1); + + + CanData_regEventMsg(msg_light_setting,CanData_responseHeadlightSetting); + + + CLS_BSP_CAN_AddMessageToSend(&can_header, (uint8_t*)&data); +} diff --git a/Application/Tasks/UsbDataHandler.c b/Application/Tasks/UsbDataHandler.c index 4f2dc96..8114b36 100644 --- a/Application/Tasks/UsbDataHandler.c +++ b/Application/Tasks/UsbDataHandler.c @@ -3,6 +3,7 @@ #include "FreeRTOS.h" #include "firmware.pb.h" #include "light.pb.h" +#include "headlight.pb.h" #include "usb_device.h" #include #include "cls_device.pb.h" @@ -62,7 +63,9 @@ union { cls_light_SaveThemeSettings msg_cls_light_SaveThemeSettings; cls_light_RequestThemeSetting msg_cls_light_RequestThemeSetting; cls_usb_JumpToBootloader msg_cls_usb_JumpToBootloader; - + cls_headlight_Settings msg_cls_headlight_Settings; + cls_headlight_SaveSettings msg_cls_headlight_SaveSettings; + cls_headlight_RequestSettings msg_cls_headlight_RequestSettings; } mem_msg_decode; @@ -121,6 +124,9 @@ message_handler_t message_handlers[] = { MESSAGE_HANDLER(cls_usb_PackageType_LIGHT_SETTING_THEME_SAVE, cls_light_SaveThemeSettings), MESSAGE_HANDLER(cls_usb_PackageType_LIGHT_REQUEST_THEME, cls_light_RequestThemeSetting), MESSAGE_HANDLER(cls_usb_PackageType_JUMP_TO_BOOTLOADER, cls_usb_JumpToBootloader), + MESSAGE_HANDLER(cls_usb_PackageType_HEADLIGHT_SETTINGS, cls_headlight_Settings), + MESSAGE_HANDLER(cls_usb_PackageType_HEADLIGHT_SAVE_SETTINGS, cls_headlight_SaveSettings), + MESSAGE_HANDLER(cls_usb_PackageType_HEADLIGHT_REQUEST_SETTINGS, cls_headlight_RequestSettings), }; diff --git a/Application/Tasks/UsbDataHandler.h b/Application/Tasks/UsbDataHandler.h index de94b60..590b9f3 100644 --- a/Application/Tasks/UsbDataHandler.h +++ b/Application/Tasks/UsbDataHandler.h @@ -136,6 +136,9 @@ void DataClbk_cls_light_GlobalTheme(void* msg, uint32_t length); void DataClbk_cls_light_ThemeSettings(void* msg, uint32_t length); void DataClbk_cls_light_SaveThemeSettings(void* msg, uint32_t length); void DataClbk_cls_light_RequestThemeSetting(void* msg, uint32_t length); +void DataClbk_cls_headlight_Settings(void* msg, uint32_t length); +void DataClbk_cls_headlight_SaveSettings(void* msg, uint32_t length); +void DataClbk_cls_headlight_RequestSettings(void* msg, uint32_t length); #include "usb.pb.h" void USBDataResonse(void * msg, const pb_msgdesc_t *fields, cls_usb_PackageType typeid); diff --git a/CMakeLists.txt b/CMakeLists.txt index f124fa0..1d45705 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -124,6 +124,7 @@ nanopb_generate_cpp(PROTO_SRCS PROTO_HDRS RELPATH proto proto/cls_device.proto proto/light.proto proto/usb.proto + proto/headlight.proto ) add_library(PROTOS ${PROTO_SRCS} ${PROTO_HDRS}) target_include_directories(PROTOS PUBLIC ${NANOPB_INCLUDE_DIRS} ${PROJECT_BINARY_DIR}) diff --git a/proto b/proto index 4ff29f9..06dd6f8 160000 --- a/proto +++ b/proto @@ -1 +1 @@ -Subproject commit 4ff29f9d5bb66ba09e48e97a45ed0b5ea206a0e0 +Subproject commit 06dd6f873db65aabab384b1a06854b9b0e065491 diff --git a/tools/CMakeLists.txt b/tools/CMakeLists.txt index b55af65..730505d 100644 --- a/tools/CMakeLists.txt +++ b/tools/CMakeLists.txt @@ -6,6 +6,7 @@ ${PROTO_SRC_DIR}/firmware.proto ${PROTO_SRC_DIR}/light.proto ${PROTO_SRC_DIR}/usb.proto ${PROTO_SRC_DIR}/cls_device.proto +${PROTO_SRC_DIR}/headlight.proto ) # Specify where you want to generate the python code diff --git a/tools/light_test.py b/tools/light_test.py index a822d2a..3287b87 100644 --- a/tools/light_test.py +++ b/tools/light_test.py @@ -4,25 +4,26 @@ from google.protobuf.message import DecodeError from serial.tools import list_ports from light_pb2 import GlobalBrightness, Theme, GlobalTheme, ThemeSettings +from headlight_pb2 import Settings, RequestSettings from usb_pb2 import PackageType from vcp_driver import * if __name__ == "__main__": ser = setup_connection() # Create a message - request = GlobalBrightness() - request.brightness = 100 + #request = GlobalBrightness() + #request.brightness = 100 # Serialize the request to a bytearray - request_data = request.SerializeToString() + #request_data = request.SerializeToString() # Send the request - send_package(PackageType.LIGHT_GLOBAL_BRIGHT, request_data, ser) + #send_package(PackageType.LIGHT_GLOBAL_BRIGHT, request_data, ser) - request = GlobalTheme() - request.theme = 1 - request_data = request.SerializeToString() - send_package(PackageType.LIGHT_GLOBAL_THEME, request_data, ser) + #request = GlobalTheme() + #request.theme = 1 + #request_data = request.SerializeToString() + #send_package(PackageType.LIGHT_GLOBAL_THEME, request_data, ser) # request = ThemeSettings() @@ -33,3 +34,14 @@ if __name__ == "__main__": # request.animation = 2 # request_data = request.SerializeToString() # send_package(PackageType.LIGHT_SETTING_THEME, request_data, ser) + + + request = Settings() + request.deviceId = 1 + request.alpha = 0.001 + request.on_threshold = 600 + request.off_threshold = 400 + request.on_time = 100 + request.input_invert = False + request_data = request.SerializeToString() + send_package(PackageType.HEADLIGHT_SETTINGS, request_data, ser) diff --git a/tools/test_get_theme.py b/tools/test_get_theme.py index 580e3ff..3f6a3f6 100644 --- a/tools/test_get_theme.py +++ b/tools/test_get_theme.py @@ -3,21 +3,20 @@ import struct from google.protobuf.message import DecodeError from serial.tools import list_ports -from light_pb2 import RequestThemeSetting, Theme, ThemeSettings +from headlight_pb2 import Settings, RequestSettings from usb_pb2 import PackageType from vcp_driver import * if __name__ == "__main__": ser = setup_connection() - request = RequestThemeSetting() - request.deviceId = 0 - request.theme = 1 + request = RequestSettings() + request.deviceId = 1 print("send request") print(request) request_data = request.SerializeToString() - send_package(PackageType.LIGHT_REQUEST_THEME, request_data, ser) + send_package(PackageType.HEADLIGHT_REQUEST_SETTINGS, request_data, ser) print("wait for response") @@ -30,13 +29,13 @@ if __name__ == "__main__": print(length, typeid, check) # Check if the type is RESPONSE_DEVICE_LIST - if typeid == PackageType.LIGHT_SETTING_THEME: + if typeid == PackageType.HEADLIGHT_SETTINGS: # Read the response data from the serial port response_data = ser.read(length) # Try to parse the data as a ResponseDeviceList message try: - response = ThemeSettings.FromString(response_data) + response = Settings.FromString(response_data) except DecodeError: # If we get a DecodeError, it means the data we read is not a valid