forked from achamaikin/CCSModuleSW30Web
243 lines
5.7 KiB
C
243 lines
5.7 KiB
C
/*
|
||
* edcan_handler.c
|
||
*
|
||
* В этом файле расположены обработчики приходящих пакетов для пользовательских регистров
|
||
*
|
||
* Created on: Jul 5, 2024
|
||
* Author: colorbass
|
||
*/
|
||
|
||
|
||
#include <edcan.h>
|
||
#include "stdio.h"
|
||
#include "soft_rtc.h"
|
||
#include "charger_gbt.h"
|
||
|
||
// * здесь объявлять внешние устройства и их регистры *
|
||
//uint8_t edcan_register_BMS[256];//300...3FF
|
||
|
||
|
||
////meter registers
|
||
//#define EDCAN_ID_METER 0x10
|
||
//#define EDCAN_REG_METER_VOLTAGE 0x03
|
||
//#define EDCAN_REG_METER_CURRENT 0x04
|
||
|
||
|
||
//own registers
|
||
#define EDCAN_REG_CHARGER_ENABLE 0x100
|
||
|
||
|
||
/* Charger info registers */
|
||
#define EDCAN_REG_CHARGER_INFO 0x200
|
||
//UNIX TIME
|
||
#define EDCAN_REG_TIME_0 0x210
|
||
#define EDCAN_REG_TIME_1 0x211
|
||
#define EDCAN_REG_TIME_2 0x212
|
||
#define EDCAN_REG_TIME_3 0x213
|
||
|
||
#define EDCAN_REG_MAX_LOAD 0x220
|
||
|
||
|
||
|
||
#define EDCAN_REG_BRM 0x310
|
||
|
||
#define EDCAN_REG_BCP 0x350
|
||
|
||
#define EDCAN_REG_BRO 0x35F
|
||
|
||
#define EDCAN_REG_BCL 0x360
|
||
|
||
#define EDCAN_REG_BCS 0x370
|
||
|
||
#define EDCAN_REG_BSM 0x380
|
||
|
||
|
||
#define EDCAN_REG_OUTPUT 0x500
|
||
|
||
GBT_EDCAN_Output_t GBT_EDCAN_Output;
|
||
|
||
|
||
#define EDCAN_REG_INPUT 0x580
|
||
|
||
GBT_EDCAN_Input_t GBT_EDCAN_Input;
|
||
|
||
|
||
|
||
/**
|
||
* @brief Handler for incoming Read packet
|
||
* Another device reply value of its registers
|
||
*
|
||
* @param SourceID: Packet Source ID
|
||
* DestinationID: Packet Destination ID
|
||
* Addr: First register address in sequence
|
||
* *data: pointer for data array
|
||
* len: length of data (1..255)
|
||
*/
|
||
void EDCAN_ReadHandler(uint8_t SourceID, uint8_t DestinationID, uint16_t Addr, uint8_t *data, uint8_t len){
|
||
//Получили пакет Read (запрошенное значение регистров)
|
||
// printf("Received packet: Read\n");
|
||
// printf("Source ID = %d\n", SourceID);
|
||
// printf("Destination ID = %d\n", DestinationID);
|
||
// printf("Address = %d\n", Addr);
|
||
// printf("Len = %d\n", len);
|
||
// printf("\n");
|
||
|
||
for (uint16_t AddrOffset = 0; AddrOffset < len; AddrOffset++){ //по очереди перебираем все полученные регистры через Handler
|
||
|
||
// * добавить сюда новые устройства *
|
||
|
||
// if(SourceID == EDCAN_ID_METER){
|
||
// printf ("register[%d] = %d\n", Addr+AddrOffset, data[AddrOffset]);
|
||
// switch(Addr+AddrOffset){
|
||
//
|
||
// // * добавить сюда внешние регистры этого устройства *
|
||
// case EDCAN_REG_METER_VOLTAGE:
|
||
// printf ("Voltage = %d\n", data[AddrOffset]);
|
||
// break;
|
||
//
|
||
// case EDCAN_REG_METER_CURRENT:
|
||
// printf ("Current = %d\n", data[AddrOffset]);
|
||
// break;
|
||
// default:
|
||
// printf ("Unknown register\n");
|
||
// }
|
||
// }
|
||
|
||
}
|
||
// printf("\n");
|
||
}
|
||
|
||
/**
|
||
* @brief Handler for incoming Read packet
|
||
* Another device reply value of its registers
|
||
*
|
||
* @param SourceID: Packet Source ID
|
||
* DestinationID: Packet Destination ID
|
||
* Addr: First register address in sequence
|
||
* *data: pointer for data array
|
||
* len: length of data (1..255)
|
||
*/
|
||
void EDCAN_WriteUserRegister(uint16_t addr, uint8_t value){
|
||
switch(addr){
|
||
//edcan_register[addr] = value;
|
||
// case EDCAN_REG_K0:
|
||
// printf ("K0 = %d\n", value);
|
||
// HAL_GPIO_WritePin (K0_GPIO_Port, K0_Pin, (value == 0));
|
||
// break;
|
||
// case EDCAN_REG_CHARGER_ENABLE:
|
||
// if(value)GBT_Charger_Enable = 1;
|
||
// else GBT_Charger_Enable = 0;
|
||
// break;
|
||
|
||
case EDCAN_REG_TIME_0:
|
||
writeTimeReg(0, value);
|
||
break;
|
||
case EDCAN_REG_TIME_1:
|
||
writeTimeReg(1, value);
|
||
break;
|
||
case EDCAN_REG_TIME_2:
|
||
writeTimeReg(2, value);
|
||
break;
|
||
case EDCAN_REG_TIME_3:
|
||
writeTimeReg(3, value);
|
||
break;
|
||
|
||
|
||
|
||
//0x220
|
||
case EDCAN_REG_MAX_LOAD ... (EDCAN_REG_MAX_LOAD+sizeof(GBT_CML_t)):
|
||
((uint8_t*)&GBT_MaxLoad)[addr - EDCAN_REG_MAX_LOAD] = value;
|
||
break;
|
||
|
||
//0x200
|
||
case EDCAN_REG_CHARGER_INFO ... (EDCAN_REG_CHARGER_INFO+sizeof(GBT_CRM_t)):
|
||
((uint8_t*)&GBT_ChargerInfo)[addr - EDCAN_REG_CHARGER_INFO] = value;
|
||
break;
|
||
|
||
//0x580
|
||
case EDCAN_REG_INPUT ... (EDCAN_REG_INPUT+sizeof(GBT_EDCAN_Input_t)):
|
||
((uint8_t*)&GBT_EDCAN_Input)[addr - EDCAN_REG_INPUT] = value;
|
||
|
||
//TODO
|
||
//GBT_EDCAN_Input.measuredCurrent;
|
||
break;
|
||
|
||
|
||
|
||
default:
|
||
printf ("Unknown register\n");
|
||
}
|
||
|
||
}
|
||
|
||
|
||
uint8_t EDCAN_GetUserRegisterValue(uint16_t addr){
|
||
switch (addr){
|
||
|
||
// /* регистры 256..2047 используются пользовательских нужд */
|
||
|
||
// 0x400
|
||
case EDCAN_REG_TIME_0:
|
||
return getTimeReg(0);
|
||
break;
|
||
|
||
case EDCAN_REG_TIME_1:
|
||
return getTimeReg(1);
|
||
break;
|
||
|
||
case EDCAN_REG_TIME_2:
|
||
return getTimeReg(2);
|
||
break;
|
||
|
||
case EDCAN_REG_TIME_3:
|
||
return getTimeReg(3);
|
||
break;
|
||
|
||
|
||
//0x220
|
||
case EDCAN_REG_MAX_LOAD ... (EDCAN_REG_MAX_LOAD+sizeof(GBT_CML_t)):
|
||
return ((uint8_t*)&GBT_MaxLoad)[addr - EDCAN_REG_MAX_LOAD];
|
||
|
||
//0x310
|
||
case EDCAN_REG_BRM ... (EDCAN_REG_BRM+sizeof(GBT_BRM_t)-1):
|
||
return ((uint8_t*)&GBT_EVInfo)[addr - EDCAN_REG_BRM];
|
||
|
||
//0x340
|
||
case EDCAN_REG_BCP ... (EDCAN_REG_BCP+sizeof(GBT_BCP_t)):
|
||
return ((uint8_t*)&GBT_BATStat)[addr - EDCAN_REG_BCP];
|
||
|
||
//0x34F
|
||
case EDCAN_REG_BRO:
|
||
return GBT_BRO;
|
||
|
||
//0x350
|
||
case EDCAN_REG_BCL ... (EDCAN_REG_BCL+sizeof(GBT_BCL_t)):
|
||
return ((uint8_t*)&GBT_ReqPower)[addr - EDCAN_REG_BCL];
|
||
|
||
//0x360
|
||
case EDCAN_REG_BCS ... (EDCAN_REG_BCS+sizeof(GBT_BCS_t)):
|
||
return ((uint8_t*)&GBT_ChargingStatus)[addr - EDCAN_REG_BCS];
|
||
|
||
//0x370
|
||
case EDCAN_REG_BSM ... (EDCAN_REG_BSM+sizeof(GBT_BSM_t)):
|
||
return ((uint8_t*)&GBT_BatteryStatus)[addr - EDCAN_REG_BSM];
|
||
|
||
|
||
//0x500
|
||
case EDCAN_REG_OUTPUT ... (EDCAN_REG_OUTPUT+sizeof(GBT_EDCAN_Output_t)):
|
||
return ((uint8_t*)&GBT_EDCAN_Output)[addr - EDCAN_REG_OUTPUT];
|
||
|
||
//0x580
|
||
case EDCAN_REG_INPUT ... (EDCAN_REG_INPUT+sizeof(GBT_EDCAN_Input_t)):
|
||
return ((uint8_t*)&GBT_EDCAN_Input)[addr - EDCAN_REG_INPUT];
|
||
|
||
|
||
default:
|
||
return 0x00;
|
||
}
|
||
}
|
||
|
||
|
||
|
||
|