mirror of
https://github.com/eddyem/tsys01.git
synced 2026-02-03 13:55:05 +03:00
add some features
This commit is contained in:
parent
a738607455
commit
13de663270
@ -111,6 +111,7 @@ $(STARTUP): $(INC_DIR)/startup/vector.c
|
|||||||
$(VERSION_FILE): *.[ch]
|
$(VERSION_FILE): *.[ch]
|
||||||
@echo " Generate version: $(NEXTVER) for date $(BUILDDATE)"
|
@echo " Generate version: $(NEXTVER) for date $(BUILDDATE)"
|
||||||
@sed -i "s/#define BUILD_NUMBER.*/#define BUILD_NUMBER \"$(NEXTVER)\"/" $(VERSION_FILE)
|
@sed -i "s/#define BUILD_NUMBER.*/#define BUILD_NUMBER \"$(NEXTVER)\"/" $(VERSION_FILE)
|
||||||
|
@sed -i "s/#define BUILDNO.*/#define BUILDNO $(NEXTVER)/" $(VERSION_FILE)
|
||||||
@sed -i "s/#define BUILD_DATE.*/#define BUILD_DATE \"$(BUILDDATE)\"/" $(VERSION_FILE)
|
@sed -i "s/#define BUILD_DATE.*/#define BUILD_DATE \"$(BUILDDATE)\"/" $(VERSION_FILE)
|
||||||
|
|
||||||
$(OBJDIR)/proto.o: proto.c $(VERSION_FILE)
|
$(OBJDIR)/proto.o: proto.c $(VERSION_FILE)
|
||||||
|
|||||||
@ -5,6 +5,7 @@ USART speed 115200. Code for ../../kicad/stm32
|
|||||||
|
|
||||||
## Serial interface commands (ends with '\n'), small letter for only local processing:
|
## Serial interface commands (ends with '\n'), small letter for only local processing:
|
||||||
- **0...7** send message to Nth controller, not broadcast (after number should be CAN command)
|
- **0...7** send message to Nth controller, not broadcast (after number should be CAN command)
|
||||||
|
- **@** set/reset debug mode
|
||||||
- **a** get raw ADC values
|
- **a** get raw ADC values
|
||||||
- **B** send dummy CAN messages to broadcast address
|
- **B** send dummy CAN messages to broadcast address
|
||||||
- **b** get/set CAN bus baudrate
|
- **b** get/set CAN bus baudrate
|
||||||
@ -15,12 +16,15 @@ USART speed 115200. Code for ../../kicad/stm32
|
|||||||
- **Ff** turn sensors off
|
- **Ff** turn sensors off
|
||||||
- **g** group (sniffer) CAN mode (print to USB terminal all incoming CAN messages with alien IDs)
|
- **g** group (sniffer) CAN mode (print to USB terminal all incoming CAN messages with alien IDs)
|
||||||
- **Hh** switch I2C to high speed (100kHz)
|
- **Hh** switch I2C to high speed (100kHz)
|
||||||
|
- **Ii** (re)init sensors
|
||||||
- **Jj** get MCU temperature
|
- **Jj** get MCU temperature
|
||||||
- **Kk** get values of U and I
|
- **Kk** get values of U and I
|
||||||
- **Ll** switch I2C to low speed (default, 10kHz)
|
- **Ll** switch I2C to low speed (default, 10kHz)
|
||||||
- **Mm** change master id to 0 (**m**) / broadcast (**M**)
|
- **Mm** change master id to 0 (**m**) / broadcast (**M**)
|
||||||
|
- **N** get build number
|
||||||
- **Oo** turn onboard diagnostic LEDs **O**n or **o**ff (both commands are local!)
|
- **Oo** turn onboard diagnostic LEDs **O**n or **o**ff (both commands are local!)
|
||||||
- **P** ping everyone over CAN
|
- **P** ping everyone over CAN
|
||||||
|
- **Qq** get system time
|
||||||
- **Rr** reinit I2C
|
- **Rr** reinit I2C
|
||||||
- **s** send CAN message (format: ID data[0..8], dec, 0x - hex, 0b - binary)
|
- **s** send CAN message (format: ID data[0..8], dec, 0x - hex, 0b - binary)
|
||||||
- **Tt** start single temperature measurement
|
- **Tt** start single temperature measurement
|
||||||
@ -72,6 +76,9 @@ First (number zero) byte of every sequence is command mark (0xA5) or data mark (
|
|||||||
- `CMD_GETUIVAL` (13) request to get values of V12, V5, I12 and V3.3
|
- `CMD_GETUIVAL` (13) request to get values of V12, V5, I12 and V3.3
|
||||||
- `CMD_GETUIVAL0` (14) answer with values of V12 and V5
|
- `CMD_GETUIVAL0` (14) answer with values of V12 and V5
|
||||||
- `CMD_GETUIVAL1` (15) answer with values of I12 and V3.3
|
- `CMD_GETUIVAL1` (15) answer with values of I12 and V3.3
|
||||||
|
- `CMD_REINIT_SENSORS` (16) (re)init all sensors (discover all and get calibrated data)
|
||||||
|
- `CMD_GETBUILDNO` (17) get by CAN firmware build number (uint32_t, littleendian, starting from byte #4)
|
||||||
|
- `CMD_SYSTIME` (18) get system time in ms (uint32_t, littleendian, starting from byte #4)
|
||||||
|
|
||||||
### Dummy commands for test purposes
|
### Dummy commands for test purposes
|
||||||
- `CMD_DUMMY0` = 0xDA,
|
- `CMD_DUMMY0` = 0xDA,
|
||||||
|
|||||||
@ -25,6 +25,7 @@
|
|||||||
#include "can_process.h"
|
#include "can_process.h"
|
||||||
#include "proto.h"
|
#include "proto.h"
|
||||||
#include "sensors_manage.h"
|
#include "sensors_manage.h"
|
||||||
|
#include "version.inc"
|
||||||
|
|
||||||
extern volatile uint32_t Tms; // timestamp data
|
extern volatile uint32_t Tms; // timestamp data
|
||||||
// id of master - all data will be sent to it
|
// id of master - all data will be sent to it
|
||||||
@ -97,13 +98,16 @@ void can_messages_proc(){
|
|||||||
SEND(" ");
|
SEND(" ");
|
||||||
printuhex(can_mesg->data[ctr]);
|
printuhex(can_mesg->data[ctr]);
|
||||||
}
|
}
|
||||||
newline(); sendbuf();
|
newline();
|
||||||
}
|
}
|
||||||
// don't process alien messages
|
// don't process alien messages
|
||||||
if(can_mesg->ID != CANID && can_mesg->ID != BCAST_ID) return;
|
if(can_mesg->ID != CANID && can_mesg->ID != BCAST_ID) return;
|
||||||
int16_t t;
|
int16_t t;
|
||||||
|
uint32_t U32;
|
||||||
if(data[0] == COMMAND_MARK){ // process commands
|
if(data[0] == COMMAND_MARK){ // process commands
|
||||||
if(len < 2) return;
|
if(len < 2) return;
|
||||||
|
// master shouldn't react to broadcast commands!
|
||||||
|
if(can_mesg->ID == BCAST_ID && CANID == MASTER_ID) return;
|
||||||
switch(data[1]){
|
switch(data[1]){
|
||||||
case CMD_DUMMY0:
|
case CMD_DUMMY0:
|
||||||
case CMD_DUMMY1:
|
case CMD_DUMMY1:
|
||||||
@ -158,6 +162,19 @@ void can_messages_proc(){
|
|||||||
case CMD_GETUIVAL:
|
case CMD_GETUIVAL:
|
||||||
senduival();
|
senduival();
|
||||||
break;
|
break;
|
||||||
|
case CMD_REINIT_SENSORS:
|
||||||
|
sensors_init();
|
||||||
|
break;
|
||||||
|
case CMD_GETBUILDNO:
|
||||||
|
b[1] = 0;
|
||||||
|
*((uint32_t*)&b[2]) = BUILDNO;
|
||||||
|
can_send_data(b, 6);
|
||||||
|
break;
|
||||||
|
case CMD_SYSTIME:
|
||||||
|
b[1] = 0;
|
||||||
|
*((uint32_t*)&b[2]) = Tms;
|
||||||
|
can_send_data(b, 6);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}else if(data[0] == DATA_MARK){ // process received data
|
}else if(data[0] == DATA_MARK){ // process received data
|
||||||
char Ns = '0' + data[1];
|
char Ns = '0' + data[1];
|
||||||
@ -216,6 +233,20 @@ void can_messages_proc(){
|
|||||||
case CMD_GETUIVAL1: // I12 and V3.3
|
case CMD_GETUIVAL1: // I12 and V3.3
|
||||||
showui("I12_", "V33_", data);
|
showui("I12_", "V33_", data);
|
||||||
break;
|
break;
|
||||||
|
case CMD_GETBUILDNO:
|
||||||
|
addtobuf("BUILDNO");
|
||||||
|
bufputchar(Ns);
|
||||||
|
bufputchar('=');
|
||||||
|
U32 = *((uint32_t*)&data[4]);
|
||||||
|
printu(U32);
|
||||||
|
break;
|
||||||
|
case CMD_SYSTIME:
|
||||||
|
addtobuf("SYSTIME");
|
||||||
|
bufputchar(Ns);
|
||||||
|
bufputchar('=');
|
||||||
|
U32 = *((uint32_t*)&data[4]);
|
||||||
|
printu(U32);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
SEND("UNKNOWN_DATA");
|
SEND("UNKNOWN_DATA");
|
||||||
}
|
}
|
||||||
@ -264,7 +295,7 @@ CAN_status can_send_data(uint8_t *data, uint8_t len){
|
|||||||
* @return next number or -1 if all data sent
|
* @return next number or -1 if all data sent
|
||||||
*/
|
*/
|
||||||
int8_t send_temperatures(int8_t N){
|
int8_t send_temperatures(int8_t N){
|
||||||
if(N < 0 || Controller_address == 0) return -1;
|
if(N < 0 || Controller_address == 0) return -1; // don't need to send Master's data over CAN bus
|
||||||
int a, p;
|
int a, p;
|
||||||
uint8_t can_data[4];
|
uint8_t can_data[4];
|
||||||
int8_t retn = N;
|
int8_t retn = N;
|
||||||
|
|||||||
@ -47,6 +47,9 @@ typedef enum{
|
|||||||
CMD_GETUIVAL, // request to get values of V12, V5, I12 and V3.3
|
CMD_GETUIVAL, // request to get values of V12, V5, I12 and V3.3
|
||||||
CMD_GETUIVAL0, // answer with values of V12 and V5
|
CMD_GETUIVAL0, // answer with values of V12 and V5
|
||||||
CMD_GETUIVAL1, // answer with values of I12 and V3.3
|
CMD_GETUIVAL1, // answer with values of I12 and V3.3
|
||||||
|
CMD_REINIT_SENSORS, // (re)init sensors
|
||||||
|
CMD_GETBUILDNO, // request for firmware build number
|
||||||
|
CMD_SYSTIME, // get system time
|
||||||
// dummy commands for test purposes
|
// dummy commands for test purposes
|
||||||
CMD_DUMMY0 = 0xDA,
|
CMD_DUMMY0 = 0xDA,
|
||||||
CMD_DUMMY1 = 0xAD
|
CMD_DUMMY1 = 0xAD
|
||||||
|
|||||||
@ -66,7 +66,7 @@ static void iwdg_setup(){
|
|||||||
}
|
}
|
||||||
|
|
||||||
int main(void){
|
int main(void){
|
||||||
uint32_t lastT = 0, lastS = 0;
|
uint32_t lastT = 0, lastS = 0, lastB = 0;
|
||||||
uint8_t gotmeasurement = 0;
|
uint8_t gotmeasurement = 0;
|
||||||
char inbuf[256];
|
char inbuf[256];
|
||||||
sysreset();
|
sysreset();
|
||||||
@ -80,6 +80,7 @@ int main(void){
|
|||||||
CAN_setup(0); // setup with default 250kbaud
|
CAN_setup(0); // setup with default 250kbaud
|
||||||
RCC->CSR |= RCC_CSR_RMVF; // remove reset flags
|
RCC->CSR |= RCC_CSR_RMVF; // remove reset flags
|
||||||
USB_setup();
|
USB_setup();
|
||||||
|
sensors_init();
|
||||||
iwdg_setup();
|
iwdg_setup();
|
||||||
|
|
||||||
while (1){
|
while (1){
|
||||||
@ -90,10 +91,19 @@ int main(void){
|
|||||||
// send dummy command to noone to test CAN bus
|
// send dummy command to noone to test CAN bus
|
||||||
//can_send_cmd(NOONE_ID, CMD_DUMMY0);
|
//can_send_cmd(NOONE_ID, CMD_DUMMY0);
|
||||||
}
|
}
|
||||||
if(lastS > Tms || Tms - lastS > 5){ // run sensors proc. once per 5ms
|
if(lastS != Tms){ // run sensors proc. once per 1ms
|
||||||
sensors_process();
|
sensors_process();
|
||||||
lastS = Tms;
|
lastS = Tms;
|
||||||
|
if(SENS_SLEEPING == Sstate){ // show temperature @ each sleeping occurence
|
||||||
|
if(!gotmeasurement){
|
||||||
|
gotmeasurement = 1;
|
||||||
|
showtemperature();
|
||||||
}
|
}
|
||||||
|
}else{
|
||||||
|
if(SENS_WAITING == Sstate) gotmeasurement = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
usb_proc();
|
||||||
can_proc();
|
can_proc();
|
||||||
CAN_status stat = CAN_get_status();
|
CAN_status stat = CAN_get_status();
|
||||||
if(stat == CAN_FIFO_OVERRUN){
|
if(stat == CAN_FIFO_OVERRUN){
|
||||||
@ -104,27 +114,22 @@ int main(void){
|
|||||||
canerror = 1;
|
canerror = 1;
|
||||||
}
|
}
|
||||||
can_messages_proc();
|
can_messages_proc();
|
||||||
if(SENS_SLEEPING == Sstate){ // show temperature @ each sleeping occurence
|
IWDG->KR = IWDG_REFRESH;
|
||||||
if(!gotmeasurement){
|
|
||||||
gotmeasurement = 1;
|
|
||||||
showtemperature();
|
|
||||||
}
|
|
||||||
}else{
|
|
||||||
gotmeasurement = 0;
|
|
||||||
}
|
|
||||||
usb_proc();
|
|
||||||
uint8_t r = 0;
|
uint8_t r = 0;
|
||||||
if((r = USB_receive(inbuf, 255))){
|
if((r = USB_receive(inbuf, 255))){
|
||||||
inbuf[r] = 0;
|
inbuf[r] = 0;
|
||||||
cmd_parser(inbuf, 1);
|
cmd_parser(inbuf, 1);
|
||||||
}
|
}
|
||||||
if(usartrx()){ // usart1 received data, store in in buffer
|
if(usartrx()){ // usart1 received data, store it in buffer
|
||||||
char *txt = NULL;
|
char *txt = NULL;
|
||||||
r = usart_getline(&txt);
|
r = usart_getline(&txt);
|
||||||
txt[r] = 0;
|
txt[r] = 0;
|
||||||
cmd_parser(txt, 0);
|
cmd_parser(txt, 0);
|
||||||
}
|
}
|
||||||
|
if(lastB - Tms > 99){ // run `sendbuf` each 100ms
|
||||||
sendbuf();
|
sendbuf();
|
||||||
|
lastB = Tms;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -34,9 +34,10 @@
|
|||||||
#include "version.inc"
|
#include "version.inc"
|
||||||
|
|
||||||
extern volatile uint8_t canerror;
|
extern volatile uint8_t canerror;
|
||||||
|
extern volatile uint32_t Tms;
|
||||||
|
|
||||||
static char buff[UARTBUFSZ+1], *bptr = buff;
|
static char buff[UARTBUFSZ+1], *bptr = buff;
|
||||||
static uint8_t blen = 0, USBcmd = 0;
|
static uint8_t blen = 0, USBcmd = 0, debugmode = 0;
|
||||||
// LEDs are OFF by default
|
// LEDs are OFF by default
|
||||||
uint8_t noLED =
|
uint8_t noLED =
|
||||||
#ifdef EBUG
|
#ifdef EBUG
|
||||||
@ -183,7 +184,6 @@ static CAN_message *parseCANmsg(char *txt){
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
SEND("Message parsed OK\n");
|
SEND("Message parsed OK\n");
|
||||||
sendbuf();
|
|
||||||
canmsg.length = (uint8_t) ctr;
|
canmsg.length = (uint8_t) ctr;
|
||||||
return &canmsg;
|
return &canmsg;
|
||||||
}
|
}
|
||||||
@ -207,7 +207,6 @@ void cmd_parser(char *txt, uint8_t isUSB){
|
|||||||
USBcmd = isUSB;
|
USBcmd = isUSB;
|
||||||
int16_t L = strlen(txt), ID = BCAST_ID;
|
int16_t L = strlen(txt), ID = BCAST_ID;
|
||||||
char _1st = txt[0];
|
char _1st = txt[0];
|
||||||
sendbuf();
|
|
||||||
if(_1st >= '0' && _1st < '8'){ // send command to Nth controller, not broadcast
|
if(_1st >= '0' && _1st < '8'){ // send command to Nth controller, not broadcast
|
||||||
if(L == 3){ // with '\n' at end!
|
if(L == 3){ // with '\n' at end!
|
||||||
ID = (CAN_ID_PREFIX & CAN_ID_MASK) | (_1st - '0');
|
ID = (CAN_ID_PREFIX & CAN_ID_MASK) | (_1st - '0');
|
||||||
@ -217,6 +216,13 @@ void cmd_parser(char *txt, uint8_t isUSB){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
switch(_1st){
|
switch(_1st){
|
||||||
|
case '@':
|
||||||
|
debugmode = !debugmode;
|
||||||
|
SEND("DEBUG mode ");
|
||||||
|
if(debugmode) SEND("ON");
|
||||||
|
else SEND("OFF");
|
||||||
|
newline();
|
||||||
|
break;
|
||||||
case 'a':
|
case 'a':
|
||||||
showADCvals();
|
showADCvals();
|
||||||
break;
|
break;
|
||||||
@ -259,6 +265,12 @@ void cmd_parser(char *txt, uint8_t isUSB){
|
|||||||
case 'h':
|
case 'h':
|
||||||
i2c_setup(HIGH_SPEED);
|
i2c_setup(HIGH_SPEED);
|
||||||
break;
|
break;
|
||||||
|
case 'I':
|
||||||
|
CANsend(ID, CMD_REINIT_SENSORS, _1st);
|
||||||
|
break;
|
||||||
|
case 'i':
|
||||||
|
sensors_init();
|
||||||
|
break;
|
||||||
case 'J':
|
case 'J':
|
||||||
CANsend(ID, CMD_GETMCUTEMP, _1st);
|
CANsend(ID, CMD_GETMCUTEMP, _1st);
|
||||||
break;
|
break;
|
||||||
@ -283,6 +295,9 @@ void cmd_parser(char *txt, uint8_t isUSB){
|
|||||||
case 'm':
|
case 'm':
|
||||||
CANsend(ID, CMD_CHANGE_MASTER, _1st);
|
CANsend(ID, CMD_CHANGE_MASTER, _1st);
|
||||||
break;
|
break;
|
||||||
|
case 'N':
|
||||||
|
CANsend(ID, CMD_GETBUILDNO, _1st);
|
||||||
|
break;
|
||||||
case 'O':
|
case 'O':
|
||||||
noLED = 0;
|
noLED = 0;
|
||||||
SEND("LED on\n");
|
SEND("LED on\n");
|
||||||
@ -296,6 +311,12 @@ void cmd_parser(char *txt, uint8_t isUSB){
|
|||||||
case 'P':
|
case 'P':
|
||||||
CANsend(ID, CMD_PING, _1st);
|
CANsend(ID, CMD_PING, _1st);
|
||||||
break;
|
break;
|
||||||
|
case 'Q':
|
||||||
|
CANsend(ID, CMD_SYSTIME, _1st);
|
||||||
|
break;
|
||||||
|
case 'q':
|
||||||
|
SEND("SYSTIME0="); printu(Tms); newline();
|
||||||
|
break;
|
||||||
case 'R':
|
case 'R':
|
||||||
CANsend(ID, CMD_REINIT_I2C, _1st);
|
CANsend(ID, CMD_REINIT_I2C, _1st);
|
||||||
break;
|
break;
|
||||||
@ -354,6 +375,7 @@ void cmd_parser(char *txt, uint8_t isUSB){
|
|||||||
SEND(
|
SEND(
|
||||||
"ALL little letters - without CAN messaging\n"
|
"ALL little letters - without CAN messaging\n"
|
||||||
"0..7 - send command to given controller (0 - this) instead of broadcast\n"
|
"0..7 - send command to given controller (0 - this) instead of broadcast\n"
|
||||||
|
"@ - set/reset debug mode\n"
|
||||||
"a - get raw ADC values\n"
|
"a - get raw ADC values\n"
|
||||||
"B - send broadcast CAN dummy message\n"
|
"B - send broadcast CAN dummy message\n"
|
||||||
"b - get/set CAN bus baudrate\n"
|
"b - get/set CAN bus baudrate\n"
|
||||||
@ -364,24 +386,26 @@ void cmd_parser(char *txt, uint8_t isUSB){
|
|||||||
"Ff- turn oFf sensors\n"
|
"Ff- turn oFf sensors\n"
|
||||||
"g - group (sniffer) CAN mode\n"
|
"g - group (sniffer) CAN mode\n"
|
||||||
"Hh- high I2C speed\n"
|
"Hh- high I2C speed\n"
|
||||||
|
"Ii- (re)init sensors\n"
|
||||||
"Jj- get MCU temperature\n"
|
"Jj- get MCU temperature\n"
|
||||||
"Kk- get U/I values\n"
|
"Kk- get U/I values\n"
|
||||||
"Ll- low I2C speed\n"
|
"Ll- low I2C speed\n"
|
||||||
"Mm- change master id to 0 (m) / broadcast (M)\n"
|
"Mm- change master id to 0 (m) / broadcast (M)\n"
|
||||||
|
"N - get build number\n"
|
||||||
"Oo- turn onboard diagnostic LEDs *O*n or *o*ff (both commands are local)\n"
|
"Oo- turn onboard diagnostic LEDs *O*n or *o*ff (both commands are local)\n"
|
||||||
"P - ping everyone over CAN\n"
|
"P - ping everyone over CAN\n"
|
||||||
|
"Qq- get system time\n"
|
||||||
"Rr- reinit I2C\n"
|
"Rr- reinit I2C\n"
|
||||||
"s - send CAN message\n"
|
"s - send CAN message\n"
|
||||||
"Tt- start temperature measurement\n"
|
"Tt- start temperature measurement\n"
|
||||||
"u - unique ID (default) CAN mode\n"
|
"u - unique ID (default) CAN mode\n"
|
||||||
"Vv- very low I2C speed\n"
|
"Vv- very low I2C speed\n"
|
||||||
"Xx- Start themperature scan\n"
|
"Xx- Start themperature scan\n"
|
||||||
"Yy- get sensors state over CAN\n"
|
"Yy- get sensors state\n"
|
||||||
"z - check CAN status for errors\n"
|
"z - check CAN status for errors\n"
|
||||||
);
|
);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
sendbuf();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// print 32bit unsigned int
|
// print 32bit unsigned int
|
||||||
@ -493,3 +517,11 @@ char *getnum(char *txt, int32_t *N){
|
|||||||
}
|
}
|
||||||
return getdec(txt, N);
|
return getdec(txt, N);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// show message in debug mode
|
||||||
|
void mesg(char *txt){
|
||||||
|
if(!debugmode) return;
|
||||||
|
addtobuf("[DBG] ");
|
||||||
|
addtobuf(txt);
|
||||||
|
bufputchar('\n');
|
||||||
|
}
|
||||||
|
|||||||
@ -46,5 +46,6 @@ void printu(uint32_t val);
|
|||||||
void printuhex(uint32_t val);
|
void printuhex(uint32_t val);
|
||||||
void sendbuf();
|
void sendbuf();
|
||||||
char *getnum(char *txt, int32_t *N);
|
char *getnum(char *txt, int32_t *N);
|
||||||
|
void mesg(char *txt);
|
||||||
|
|
||||||
#endif // __PROTO_H__
|
#endif // __PROTO_H__
|
||||||
|
|||||||
@ -56,6 +56,8 @@ static const char *statenames[] = {
|
|||||||
,[SENS_OVERCURNT_OFF] = "offbyovercurrent"
|
,[SENS_OVERCURNT_OFF] = "offbyovercurrent"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static uint8_t getcoeff(uint8_t i);
|
||||||
|
|
||||||
const char *sensors_get_statename(SensorsState x){
|
const char *sensors_get_statename(SensorsState x){
|
||||||
if(x >= SENS_STATE_CNT) return "wrongstate";
|
if(x >= SENS_STATE_CNT) return "wrongstate";
|
||||||
return statenames[x];
|
return statenames[x];
|
||||||
@ -77,7 +79,9 @@ const double mul[5] = {-1.5e-2, 1., -2., 4., -2.};
|
|||||||
*/
|
*/
|
||||||
static uint16_t calc_t(uint32_t t, int i){
|
static uint16_t calc_t(uint32_t t, int i){
|
||||||
uint16_t *coeff = coefficients[curr_mul_addr][i];
|
uint16_t *coeff = coefficients[curr_mul_addr][i];
|
||||||
if(coeff[0] == 0) return BAD_TEMPERATURE; // what is with coeffs?
|
if(coeff[0] == 0){
|
||||||
|
if(!getcoeff(i)) return BAD_TEMPERATURE; // what is with coeffs?
|
||||||
|
}
|
||||||
if(t < 600000 || t > 30000000) return BAD_TEMPERATURE; // wrong value - too small or too large
|
if(t < 600000 || t > 30000000) return BAD_TEMPERATURE; // wrong value - too small or too large
|
||||||
int j;
|
int j;
|
||||||
double d = (double)t/256., tmp = 0.;
|
double d = (double)t/256., tmp = 0.;
|
||||||
@ -92,28 +96,39 @@ static uint16_t calc_t(uint32_t t, int i){
|
|||||||
|
|
||||||
// turn off sensors' power
|
// turn off sensors' power
|
||||||
void sensors_off(){
|
void sensors_off(){
|
||||||
|
mesg("Turn off sensors");
|
||||||
MUL_OFF(); // turn off multiplexers
|
MUL_OFF(); // turn off multiplexers
|
||||||
SENSORS_OFF(); // turn off sensors' power
|
SENSORS_OFF(); // turn off sensors' power
|
||||||
Sstate = SENS_OFF;
|
Sstate = SENS_OFF;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* if all OK with current, turn ON sensors' power and change state to "initing"
|
* if all OK with current, turn ON sensors' power
|
||||||
*/
|
*/
|
||||||
void sensors_on(){
|
static int sensors_on(){
|
||||||
sens_present[0] = sens_present[1] = 0;
|
mesg("Turn on sensors");
|
||||||
curr_mul_addr = 0;
|
curr_mul_addr = 0;
|
||||||
Nsens_present = 0;
|
|
||||||
MUL_OFF();
|
MUL_OFF();
|
||||||
if(SENSORS_OVERCURNT()){
|
if(SENSORS_OVERCURNT()){
|
||||||
|
mesg("OVERCURRENT!");
|
||||||
SENSORS_OFF();
|
SENSORS_OFF();
|
||||||
Sstate = (++overcurnt_ctr > 32) ? SENS_OVERCURNT_OFF : SENS_OVERCURNT;
|
Sstate = (++overcurnt_ctr > 32) ? SENS_OVERCURNT_OFF : SENS_OVERCURNT;
|
||||||
|
return FALSE;
|
||||||
}else{
|
}else{
|
||||||
|
mesg("Powered on");
|
||||||
SENSORS_ON();
|
SENSORS_ON();
|
||||||
Sstate = SENS_INITING;
|
return TRUE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// init sensors
|
||||||
|
void sensors_init(){
|
||||||
|
sens_present[0] = sens_present[1] = 0;
|
||||||
|
overcurnt_ctr = 0;
|
||||||
|
Nsens_present = 0;
|
||||||
|
if(sensors_on()) Sstate = SENS_INITING;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* start measurement if sensors are sleeping,
|
* start measurement if sensors are sleeping,
|
||||||
* turn ON if they were OFF
|
* turn ON if they were OFF
|
||||||
@ -127,7 +142,10 @@ void sensors_start(){
|
|||||||
break;
|
break;
|
||||||
case SENS_OFF:
|
case SENS_OFF:
|
||||||
overcurnt_ctr = 0;
|
overcurnt_ctr = 0;
|
||||||
sensors_on();
|
if(sensors_on()) Sstate = SENS_START_MSRMNT;
|
||||||
|
break;
|
||||||
|
case SENS_OVERCURNT_OFF:
|
||||||
|
sensors_init();
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
@ -142,34 +160,34 @@ static void count_sensors(){
|
|||||||
++Nsens_present;
|
++Nsens_present;
|
||||||
B &= (B - 1);
|
B &= (B - 1);
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
|
SEND("count_sensors(): ");
|
||||||
|
printu(Nsens_present);
|
||||||
|
newline();
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* All procedures return 1 if they change current state due to error & 0 if all OK
|
* All procedures return TRUE if all OK or FALSE if failed and need to start scan again
|
||||||
*/
|
*/
|
||||||
// procedure call each time @ resetting
|
// procedure call each time @ resetting
|
||||||
static uint8_t resetproc(){
|
static uint8_t resetproc(){
|
||||||
uint8_t i, ctr = 0;
|
uint8_t i;
|
||||||
for(i = 0; i < 2; ++i){
|
for(i = 0; i < 2; ++i){
|
||||||
if(write_i2c(Taddr[i], TSYS01_RESET)){
|
if(write_i2c(Taddr[i], TSYS01_RESET)){
|
||||||
++ctr;
|
|
||||||
sens_present[i] |= 1<<curr_mul_addr; // set bit - found
|
sens_present[i] |= 1<<curr_mul_addr; // set bit - found
|
||||||
}else{ // not found
|
}else{ // not found
|
||||||
sens_present[i] &= ~(1<<curr_mul_addr); // reset bit - not found
|
sens_present[i] &= ~(1<<curr_mul_addr); // reset bit - not found
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// procedure call each time @ getting coefficients
|
static uint8_t getcoeff(uint8_t i){
|
||||||
static uint8_t getcoefsproc(){
|
|
||||||
uint8_t i, j;
|
|
||||||
const uint8_t regs[5] = {0xAA, 0xA8, 0xA6, 0xA4, 0xA2}; // commands for coefficients
|
const uint8_t regs[5] = {0xAA, 0xA8, 0xA6, 0xA4, 0xA2}; // commands for coefficients
|
||||||
for(i = 0; i < 2; ++i){
|
|
||||||
if(!(sens_present[i] & (1<<curr_mul_addr))) continue; // no sensors @ given line
|
|
||||||
uint8_t err = 5;
|
uint8_t err = 5;
|
||||||
uint16_t *coef = coefficients[curr_mul_addr][i];
|
uint16_t *coef = coefficients[curr_mul_addr][i];
|
||||||
for(j = 0; j < 5; ++j){
|
for(uint8_t j = 0; j < 5; ++j){
|
||||||
uint32_t K;
|
uint32_t K;
|
||||||
if(write_i2c(Taddr[i], regs[j])){
|
if(write_i2c(Taddr[i], regs[j])){
|
||||||
if(read_i2c(Taddr[i], &K, 2)){
|
if(read_i2c(Taddr[i], &K, 2)){
|
||||||
@ -179,10 +197,19 @@ static uint8_t getcoefsproc(){
|
|||||||
}else break;
|
}else break;
|
||||||
}
|
}
|
||||||
if(err){ // restart all procedures if we can't get coeffs of present sensor
|
if(err){ // restart all procedures if we can't get coeffs of present sensor
|
||||||
return 1;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// procedure call each time @ getting coefficients
|
||||||
|
static uint8_t getcoefsproc(){
|
||||||
|
uint8_t r = TRUE;
|
||||||
|
for(uint8_t i = 0; i < 2; ++i){
|
||||||
|
if(!(sens_present[i] & (1<<curr_mul_addr))) continue; // no sensors @ given line
|
||||||
|
if(!getcoeff(i)) r = FALSE;
|
||||||
}
|
}
|
||||||
return 0;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
// procedure call each time @ start measurement
|
// procedure call each time @ start measurement
|
||||||
@ -190,18 +217,25 @@ static uint8_t msrtempproc(){
|
|||||||
uint8_t i, j;
|
uint8_t i, j;
|
||||||
for(i = 0; i < 2; ++i){
|
for(i = 0; i < 2; ++i){
|
||||||
if(!(sens_present[i] & (1<<curr_mul_addr))){ // no sensors @ given line - try to find it
|
if(!(sens_present[i] & (1<<curr_mul_addr))){ // no sensors @ given line - try to find it
|
||||||
resetproc();
|
if(write_i2c(Taddr[i], TSYS01_RESET)){
|
||||||
if(sens_present[i] & (1<<curr_mul_addr)){ // found!
|
sens_present[i] |= 1<<curr_mul_addr;
|
||||||
if(getcoefsproc()) continue; // error
|
mesg("One sensor added");
|
||||||
else count_sensors(); // refresh Nsens_present
|
count_sensors();
|
||||||
}else continue; // not found - continue
|
// if(getcoeff(i)) count_sensors();
|
||||||
|
}
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
for(j = 0; j < 5; ++j){
|
for(j = 0; j < 5; ++j){
|
||||||
if(write_i2c(Taddr[i], TSYS01_START_CONV)) break;
|
if(write_i2c(Taddr[i], TSYS01_START_CONV)) break;
|
||||||
if(!write_i2c(Taddr[i], TSYS01_RESET)) i2c_setup(CURRENT_SPEED); // maybe I2C restart will solve the problem?
|
//if(!write_i2c(Taddr[i], TSYS01_RESET)) i2c_setup(CURRENT_SPEED); // maybe I2C restart will solve the problem?
|
||||||
|
}
|
||||||
|
if(j == 5){
|
||||||
|
sens_present[i] &= ~(1<<curr_mul_addr); // clear presence flag
|
||||||
|
mesg("One sensor removed");
|
||||||
|
count_sensors();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// procedure call each time @ read temp
|
// procedure call each time @ read temp
|
||||||
@ -224,13 +258,13 @@ static uint8_t gettempproc(){
|
|||||||
write_i2c(Taddr[i], TSYS01_RESET);
|
write_i2c(Taddr[i], TSYS01_RESET);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 2 phase for each call: 1) set address & turn on mul.; 2) call function & turn off mul.
|
* 2 phase for each call: 1) set address & turn on mul.; 2) call function & turn off mul.
|
||||||
* Change address @ call function `procfn`
|
* Change address @ call function `procfn`
|
||||||
* @return 1 if scan is over
|
* @return TRUE if scan is over
|
||||||
*/
|
*/
|
||||||
static uint8_t sensors_scan(uint8_t (* procfn)()){
|
static uint8_t sensors_scan(uint8_t (* procfn)()){
|
||||||
static uint8_t callctr = 0;
|
static uint8_t callctr = 0;
|
||||||
@ -242,16 +276,16 @@ static uint8_t sensors_scan(uint8_t (* procfn)()){
|
|||||||
callctr = 0;
|
callctr = 0;
|
||||||
uint8_t s = procfn();
|
uint8_t s = procfn();
|
||||||
MUL_OFF();
|
MUL_OFF();
|
||||||
if(s){ // start scan again if error
|
if(!s){ // start scan again if error
|
||||||
curr_mul_addr = 0;
|
curr_mul_addr = 0;
|
||||||
return 0;
|
return FALSE;
|
||||||
}
|
}
|
||||||
if(++curr_mul_addr > MUL_MAX_ADDRESS){ // scan is over
|
if(++curr_mul_addr > MUL_MAX_ADDRESS){ // scan is over
|
||||||
curr_mul_addr = 0;
|
curr_mul_addr = 0;
|
||||||
return 1;
|
return TRUE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// print coefficients @debug console
|
// print coefficients @debug console
|
||||||
@ -277,10 +311,8 @@ void showcoeffs(){
|
|||||||
// print temperatures @debug console
|
// print temperatures @debug console
|
||||||
void showtemperature(){
|
void showtemperature(){
|
||||||
int a, p;
|
int a, p;
|
||||||
if(Nsens_present == 0){
|
if(Nsens_present == 0 || Ntemp_measured == 0){
|
||||||
return;
|
SEND("No sensors found");
|
||||||
}
|
|
||||||
if(Ntemp_measured == 0){
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
for(a = 0; a <= MUL_MAX_ADDRESS; ++a){
|
for(a = 0; a <= MUL_MAX_ADDRESS; ++a){
|
||||||
@ -313,32 +345,39 @@ void sensors_process(){
|
|||||||
Sstate = (++overcurnt_ctr > 32) ? SENS_OVERCURNT_OFF : SENS_OVERCURNT;
|
Sstate = (++overcurnt_ctr > 32) ? SENS_OVERCURNT_OFF : SENS_OVERCURNT;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
switch (Sstate){
|
switch(Sstate){
|
||||||
case SENS_INITING: // initialisation (restart I2C)
|
case SENS_INITING: // initialisation (restart I2C)
|
||||||
|
mesg("SENS_INITING");
|
||||||
i2c_setup(CURRENT_SPEED);
|
i2c_setup(CURRENT_SPEED);
|
||||||
Sstate = SENS_RESETING;
|
Sstate = SENS_RESETING;
|
||||||
lastSensT = Tms;
|
lastSensT = Tms;
|
||||||
overcurnt_ctr = 0;
|
NsentOverCAN = -1;
|
||||||
break;
|
break;
|
||||||
case SENS_RESETING: // reset & discovery procedure
|
case SENS_RESETING: // reset & discovery procedure
|
||||||
|
if(NsentOverCAN == -1){
|
||||||
|
mesg("SENS_RESETING");
|
||||||
|
NsentOverCAN = 0;
|
||||||
|
}
|
||||||
if(Tms - lastSensT > POWERUP_TIME){
|
if(Tms - lastSensT > POWERUP_TIME){
|
||||||
overcurnt_ctr = 0;
|
|
||||||
if(sensors_scan(resetproc)){
|
if(sensors_scan(resetproc)){
|
||||||
count_sensors(); // get total amount of sensors
|
count_sensors(); // get total amount of sensors
|
||||||
if(Nsens_present){
|
if(Nsens_present){
|
||||||
Sstate = SENS_GET_COEFFS;
|
Sstate = SENS_GET_COEFFS;
|
||||||
}else{ // no sensors found
|
}else{ // no sensors found
|
||||||
|
mesg("No sensors found");
|
||||||
sensors_off();
|
sensors_off();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case SENS_GET_COEFFS: // get coefficients
|
case SENS_GET_COEFFS: // get coefficients
|
||||||
|
mesg("SENS_GET_COEFFS");
|
||||||
if(sensors_scan(getcoefsproc)){
|
if(sensors_scan(getcoefsproc)){
|
||||||
Sstate = SENS_START_MSRMNT;
|
Sstate = SENS_SLEEPING; // sleep after got coefficients
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case SENS_START_MSRMNT: // send all sensors command to start measurements
|
case SENS_START_MSRMNT: // send all sensors command to start measurements
|
||||||
|
mesg("SENS_START_MSRMNT");
|
||||||
if(sensors_scan(msrtempproc)){
|
if(sensors_scan(msrtempproc)){
|
||||||
lastSensT = Tms;
|
lastSensT = Tms;
|
||||||
Sstate = SENS_WAITING;
|
Sstate = SENS_WAITING;
|
||||||
@ -346,33 +385,50 @@ void sensors_process(){
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case SENS_WAITING: // wait for end of conversion
|
case SENS_WAITING: // wait for end of conversion
|
||||||
|
mesg("SENS_WAITING");
|
||||||
if(Tms - lastSensT > CONV_TIME){
|
if(Tms - lastSensT > CONV_TIME){
|
||||||
|
NsentOverCAN = -1;
|
||||||
Sstate = SENS_GATHERING;
|
Sstate = SENS_GATHERING;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case SENS_GATHERING: // scan all sensors, get thermal data & calculate temperature
|
case SENS_GATHERING: // scan all sensors, get thermal data & calculate temperature
|
||||||
|
if(NsentOverCAN < 0){
|
||||||
|
mesg("SENS_SLEEPING");
|
||||||
|
NsentOverCAN = 0;
|
||||||
|
}
|
||||||
if(sensors_scan(gettempproc)){
|
if(sensors_scan(gettempproc)){
|
||||||
lastSensT = Tms;
|
lastSensT = Tms;
|
||||||
NsentOverCAN = 0;
|
NsentOverCAN = 0;
|
||||||
Sstate = SENS_SLEEPING;
|
Sstate = SENS_SENDING_DATA;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case SENS_SLEEPING: // wait for `SLEEP_TIME` till next measurements
|
case SENS_SENDING_DATA:
|
||||||
|
mesg("SENS_SENDING_DATA");
|
||||||
NsentOverCAN = send_temperatures(NsentOverCAN); // call sending T process
|
NsentOverCAN = send_temperatures(NsentOverCAN); // call sending T process
|
||||||
if(NsentOverCAN == -1){
|
if(NsentOverCAN < 0){ // all data sent -> sleep
|
||||||
|
Sstate = SENS_SLEEPING;
|
||||||
|
/*
|
||||||
if(Nsens_present != Ntemp_measured){ // restart sensors only after measurements sent
|
if(Nsens_present != Ntemp_measured){ // restart sensors only after measurements sent
|
||||||
|
mesg("restart");
|
||||||
i2c_setup(CURRENT_SPEED);
|
i2c_setup(CURRENT_SPEED);
|
||||||
sensors_on();
|
sensors_on();
|
||||||
|
}*/
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case SENS_SLEEPING: // wait for `SLEEP_TIME` till next measurements in scan mode
|
||||||
|
if(NsentOverCAN < 0){
|
||||||
|
mesg("SENS_SLEEPING");
|
||||||
|
NsentOverCAN = 0;
|
||||||
}
|
}
|
||||||
if(sensors_scan_mode){ // sleep until next measurement start
|
if(sensors_scan_mode){ // sleep until next measurement start
|
||||||
if(Tms - lastSensT > SLEEP_TIME){
|
if(Tms - lastSensT > SLEEP_TIME){
|
||||||
Sstate = SENS_START_MSRMNT;
|
Sstate = SENS_START_MSRMNT;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case SENS_OVERCURNT: // try to reinit all after overcurrent
|
case SENS_OVERCURNT: // try to reinit all after overcurrent
|
||||||
sensors_on();
|
mesg("SENS_OVERCURNT");
|
||||||
|
if(sensors_on()) Sstate = SENS_SLEEPING;
|
||||||
break;
|
break;
|
||||||
default: // do nothing
|
default: // do nothing
|
||||||
break;
|
break;
|
||||||
|
|||||||
@ -46,6 +46,7 @@ typedef enum{
|
|||||||
,SENS_OFF // 7 sensors' power is off by external command
|
,SENS_OFF // 7 sensors' power is off by external command
|
||||||
,SENS_OVERCURNT // 8 overcurrent detected @ any stage
|
,SENS_OVERCURNT // 8 overcurrent detected @ any stage
|
||||||
,SENS_OVERCURNT_OFF // 9 sensors' power is off due to continuous overcurrent
|
,SENS_OVERCURNT_OFF // 9 sensors' power is off due to continuous overcurrent
|
||||||
|
,SENS_SENDING_DATA // A send data over CAN bus
|
||||||
,SENS_STATE_CNT
|
,SENS_STATE_CNT
|
||||||
} SensorsState;
|
} SensorsState;
|
||||||
|
|
||||||
@ -60,7 +61,7 @@ const char *sensors_get_statename(SensorsState x);
|
|||||||
void sensors_process();
|
void sensors_process();
|
||||||
|
|
||||||
void sensors_off();
|
void sensors_off();
|
||||||
void sensors_on();
|
void sensors_init();
|
||||||
void sensors_start();
|
void sensors_start();
|
||||||
void showcoeffs();
|
void showcoeffs();
|
||||||
void showtemperature();
|
void showtemperature();
|
||||||
|
|||||||
Binary file not shown.
@ -1,2 +1,3 @@
|
|||||||
#define BUILD_NUMBER "28"
|
#define BUILD_NUMBER "44"
|
||||||
#define BUILD_DATE "2022-01-31"
|
#define BUILD_DATE "2022-02-02"
|
||||||
|
#define BUILDNO 44
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user