Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Sync with original #4

Merged
merged 8 commits into from
Nov 28, 2020
Prev Previous commit
Next Next commit
Avoid resending responses from M220/M221/M106. Better FanSpeed, FeedR…
…ate, FlowRate adjustment handling during print. (bigtreetech#1283)

* M220/M221 no resend

* Removed some comments

* Typo

* More refinements

* more changes, fixed strange behaviours

* Cleanup

* Better FanSpeed, FeedRate, FlowRate handling during print.
  • Loading branch information
kisslorand authored Nov 27, 2020
commit 433690f63288a29dd53249eabb97d476be567c48
72 changes: 57 additions & 15 deletions TFT/src/User/API/FanControl.c
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,17 @@ char* fanID[MAX_FAN_COUNT];
char* fanCmd[MAX_FAN_COUNT];
uint8_t fanType[MAX_FAN_COUNT];

static uint8_t fanSpeed[MAX_FAN_COUNT] = {0};
static uint8_t lastFanSpeed[MAX_FAN_COUNT] = {0};
static uint8_t desiredFanSpeed[MAX_FAN_COUNT] = {0}; // by Lori
static uint8_t newFanSpeed[MAX_FAN_COUNT] = {0}; // by Lori
static uint8_t curFanSpeed[MAX_FAN_COUNT] = {0}; // by Lori

static bool fan_send_waiting[MAX_FAN_COUNT] = {false};
static bool fanQueryWait = false;
static bool fanQueryEnable = false;

static uint32_t nextSendTime = 0;
#define nextSendWait 500 // 1 second is 1000

uint8_t fanGetTypID(uint8_t startIndex, uint8_t type) {
for(uint8_t i = startIndex; i < MAX_FAN_COUNT; i++) {
if(fanType[i] == type) return i;
Expand Down Expand Up @@ -52,25 +56,62 @@ bool fanIsType(uint8_t i, uint8_t type) {
return (fanType[i] == type);
}

void fanSetSpeed(uint8_t i, uint8_t speed)
void fanSetRcvSpeed(uint8_t i, uint8_t speed) // by Lori
{
fanSpeed[i] = speed;
curFanSpeed[i] = newFanSpeed[i]= desiredFanSpeed[i] = speed; // avoid resend received values
}

uint8_t fanGetSpeed(uint8_t i)

void fanSetDesiredSpeed(uint8_t i, uint8_t speed)
{
return fanSpeed[i];
desiredFanSpeed[i] = speed;
}

void fanSetSpeedPercent(uint8_t i, uint8_t percent)
uint8_t fanGetDesiredSpeed(uint8_t i)
{
return desiredFanSpeed[i];
}

void fanSetDesiredPercent(uint8_t i, uint8_t percent)
{
percent = NOBEYOND(0, percent, 100);
fanSpeed[i] = (percent * infoSettings.fan_max[i]) / 100;
desiredFanSpeed[i] = (percent * infoSettings.fan_max[i]) / 100;
}

uint8_t fanGetSpeedPercent(uint8_t i)
uint8_t fanGetDesiredPercent(uint8_t i)
{
return (fanSpeed[i] * 100.0f) / infoSettings.fan_max[i] + 0.5f;
return (desiredFanSpeed[i] * 100.0f) / infoSettings.fan_max[i] + 0.5f;
}

void fanSetCurSpeed(uint8_t i, uint8_t speed)
{
curFanSpeed[i] = speed;
}

uint8_t fanGetCurSpeed(uint8_t i)
{
return curFanSpeed[i];
}

void fanSetCurPercent(uint8_t i, uint8_t percent)
{
percent = NOBEYOND(0, percent, 100);
curFanSpeed[i] = (percent * infoSettings.fan_max[i]) / 100;
}

uint8_t fanGetCurPercent(uint8_t i)
{
return (curFanSpeed[i] * 100.0f) / infoSettings.fan_max[i] + 0.5f;
}

void fanSetNewSpeed(uint8_t i, uint8_t speed)
{
curFanSpeed[i] = speed;
}

uint8_t fanGetNewSpeed(uint8_t i)
{
return curFanSpeed[i];
}

void fanSetSendWaiting(uint8_t i, bool isWaiting)
Expand All @@ -83,23 +124,24 @@ void fanSpeedQuerySetWait(bool wait)
fanQueryWait = wait;
}


void loopFan(void)
{
for (uint8_t i = 0; i < (infoSettings.fan_count + infoSettings.fan_ctrl_count); i++)
{
if (lastFanSpeed[i] != fanSpeed[i])
if ((newFanSpeed[i] != desiredFanSpeed[i]) && (OS_GetTimeMs() > nextSendTime))
{
lastFanSpeed[i] = fanSpeed[i];
if(fan_send_waiting[i] == false)
{
fan_send_waiting[i] = true;
if(fanIsType(i,FAN_TYPE_F) || fanIsType(i,FAN_TYPE_CTRL_S)) {
storeCmd("%s S%d\n", fanCmd[i],fanSpeed[i]);
fan_send_waiting[i] = storeCmd("%s S%d\n", fanCmd[i],desiredFanSpeed[i]);
}
else if (fanIsType(i,FAN_TYPE_CTRL_I)) {
storeCmd("%s I%d\n", fanCmd[i],fanSpeed[i]);
fan_send_waiting[i] = storeCmd("%s I%d\n", fanCmd[i],desiredFanSpeed[i]);
}
}
if (fan_send_waiting[i] == true) newFanSpeed[i] = desiredFanSpeed[i];
nextSendTime = OS_GetTimeMs() + nextSendWait; // avoid rapid fire, clogging the queue
}
}
}
Expand Down
17 changes: 12 additions & 5 deletions TFT/src/User/API/FanControl.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,15 +20,22 @@ extern uint8_t fanType[MAX_FAN_COUNT];

bool fanIsType(uint8_t i, uint8_t type);
uint8_t fanGetTypID(uint8_t startIndex, uint8_t type);
void fanSetSpeed(uint8_t i, uint8_t speed);
uint8_t fanGetSpeed(uint8_t i);
void fanSetSpeedPercent(uint8_t i, uint8_t percent);
uint8_t fanGetSpeedPercent(uint8_t i);
void fanSetRcvSpeed(uint8_t i, uint8_t speed);
void fanSetDesiredSpeed(uint8_t i, uint8_t speed);
uint8_t fanGetDesiredSpeed(uint8_t i);
void fanSetDesiredPercent(uint8_t i, uint8_t percent);
uint8_t fanGetDesiredPercent(uint8_t i);
void fanSetCurSpeed(uint8_t i, uint8_t speed);
uint8_t fanGetCurSpeed(uint8_t i);
void fanSetCurPercent(uint8_t i, uint8_t percent);
uint8_t fanGetCurPercent(uint8_t i);
void fanSetNewSpeed(uint8_t i, uint8_t speed);
uint8_t fanGetNewSpeed(uint8_t i);
void fanSetSendWaiting(uint8_t i, bool isWaiting);
void fanBuildList(void);
void fanControlInit(void);
void loopFan(void);

bool FanChanged(uint8_t i);
void fanSpeedQuery(void);
void fanSpeedQuerySetWait(bool wait);

Expand Down
21 changes: 15 additions & 6 deletions TFT/src/User/API/SpeedControl.c
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@ static uint16_t curPercent[SPEED_NUM] = {100, 100}; //Speed Flow
static bool send_waiting[SPEED_NUM];
static bool queryWait = false;

static uint32_t nextSpeedTime = 0;
#define nextSpeedWait 500 // 1 second is 1000

void speedSetSendWaiting(u8 tool, bool isWaiting)
{
send_waiting[tool] = isWaiting;
Expand All @@ -18,12 +21,17 @@ void speedQuerySetWait(bool wait)
queryWait = wait;
}

void speedSetPercent(u8 tool, u16 per)
void speedSetRcvPercent(uint8_t tool, uint16_t per)
{
curPercent[tool] = percent[tool] = per;
}

void speedSetPercent(uint8_t tool, uint16_t per)
{
percent[tool]=NOBEYOND(SPEED_MIN, per, SPEED_MAX);
}

u16 speedGetPercent(u8 tool)
uint16_t speedGetPercent(uint8_t tool)
{
return percent[tool];
}
Expand All @@ -46,15 +54,16 @@ bool SpeedChanged(u8 i)
void loopSpeed(void)
{
for(u8 i = 0; i < SPEED_NUM;i++)
if(curPercent[i] != percent[i])
if((curPercent[i] != percent[i]) && (OS_GetTimeMs() > nextSpeedTime))
{
curPercent[i] = percent[i];
if(send_waiting[i] != true)
if(send_waiting[i] == false)
{
send_waiting[i] = true;
const char *speedCmd[SPEED_NUM] = {"M220","M221"};
storeCmd("%s S%d\n",speedCmd[i], percent[i]);
send_waiting[i] = storeCmd("%s S%d\n",speedCmd[i], percent[i]);
}
if (send_waiting[i] == true) curPercent[i] = percent[i];
nextSpeedTime = OS_GetTimeMs() + nextSpeedWait; // avoid rapid fire, clogging the queue
}
}

Expand Down
1 change: 1 addition & 0 deletions TFT/src/User/API/SpeedControl.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ extern "C" {

void speedSetSendWaiting(uint8_t tool, bool isWaiting);
void speedQuerySetWait(bool wait);
void speedSetRcvPercent(uint8_t tool, uint16_t per);
void speedSetPercent(uint8_t tool, uint16_t per);
uint16_t speedGetPercent(uint8_t tool);
bool SpeedChanged(uint8_t i);
Expand Down
26 changes: 11 additions & 15 deletions TFT/src/User/API/interfaceCmd.c
Original file line number Diff line number Diff line change
Expand Up @@ -111,12 +111,14 @@ void mustStoreScript(const char * format,...)
char *p = script;
uint16_t i = 0;
char cmd[CMD_MAX_CHAR];
for (;;) {
for (;;)
{
char c = *p++;
if (!c) return;
cmd[i++] = c;

if (c == '\n') {
if (c == '\n')
{
cmd[i] = 0;
mustStoreCmd("%s", cmd);
i = 0;
Expand Down Expand Up @@ -529,13 +531,13 @@ void sendQueueCmd(void)
{
uint8_t i = cmd_seen('P') ? cmd_value() : 0;
if(cmd_seen('S') && fanIsType(i, FAN_TYPE_F) ) {
fanSetSpeed(i, cmd_value());
fanSetCurSpeed(i, cmd_value());
fanSetSendWaiting(i, false);
}
else if (!cmd_seen('\n'))
{
char buf[12];
sprintf(buf, "S%u\n", fanGetSpeed(i));
sprintf(buf, "S%u\n", fanGetCurSpeed(i));
strcat(infoCmd.queue[infoCmd.index_r].gcode,(const char*)buf);
}
break;
Expand All @@ -544,23 +546,17 @@ void sendQueueCmd(void)
case 107: //M107
{
uint8_t i = cmd_seen('P') ? cmd_value() : 0;
if (fanIsType(i, FAN_TYPE_F)) fanSetSpeed(i, 0);
if (fanIsType(i, FAN_TYPE_F)) fanSetCurSpeed(i, 0);
break;
}

case 710: //M710 Controller Fan
{
u8 i = 0;
if(cmd_seen('S')) {
i = fanGetTypID(i,FAN_TYPE_CTRL_S);
fanSetSpeed(i, cmd_value());
fanSetSendWaiting(i, false);
}
if(cmd_seen('I')) {
i = fanGetTypID(i=0,FAN_TYPE_CTRL_I);
fanSetSpeed(i, cmd_value());
fanSetSendWaiting(i, false);
}
if(cmd_seen('S')) i = fanGetTypID(i,FAN_TYPE_CTRL_S);
if(cmd_seen('I')) i = fanGetTypID(i=0,FAN_TYPE_CTRL_I);
fanSetCurSpeed(i, cmd_value());
fanSetSendWaiting(i, false);
break;
}

Expand Down
29 changes: 15 additions & 14 deletions TFT/src/User/API/parseACK.c
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ const ECHO knownEcho[] = {
{ECHO_NOTIFY_NONE, "Unknown command: \"M150"}, //M150
};

uint8_t forceIgnore[ECHO_ID_COUNT] = {0};
// uint8_t forceIgnore[ECHO_ID_COUNT] = {0};

void setCurrentAckSrc(uint8_t src)
{
Expand Down Expand Up @@ -128,10 +128,10 @@ void ackPopupInfo(const char *info)
}
}

void setIgnoreEcho(ECHO_ID msgId, bool state)
{
forceIgnore[msgId] = state;
}
// void setIgnoreEcho(ECHO_ID msgId, bool state)
// {
// forceIgnore[msgId] = state;
// }

bool processKnownEcho(void)
{
Expand All @@ -154,16 +154,16 @@ bool processKnownEcho(void)
{
if (knownEcho[i].notifyType == ECHO_NOTIFY_NONE)
return isKnown;
if (forceIgnore[i] == 0)
{
// if (forceIgnore[i] == 0)
// {
if (knownEcho[i].notifyType == ECHO_NOTIFY_TOAST)
addToast(DIALOG_TYPE_INFO, dmaL2Cache);
else if (knownEcho[i].notifyType == ECHO_NOTIFY_DIALOG)
{
BUZZER_PLAY(sound_notify);
addNotification(DIALOG_TYPE_INFO, (char*)echomagic, (char*)dmaL2Cache + ack_index, true);
}
}
// }
}
return isKnown;
}
Expand Down Expand Up @@ -739,21 +739,21 @@ void parseACK(void)
// parse and store feed rate percentage
else if(ack_seen("FR:"))
{
speedSetPercent(0,ack_value());
speedSetRcvPercent(0,ack_value());
speedQuerySetWait(false);
}
// parse and store flow rate percentage
else if(ack_seen("Flow: "))
{
speedSetPercent(1,ack_value());
speedSetRcvPercent(1,ack_value());
speedQuerySetWait(false);
}
// parse fan speed
else if(ack_seen("M106 P"))
{
u8 i = ack_value();
if (ack_seen("S")) {
fanSetSpeed(i, ack_value());
fanSetRcvSpeed(i, ack_value());
}
}
// parse controller fan
Expand All @@ -762,12 +762,12 @@ void parseACK(void)
u8 i = 0;
if (ack_seen("S")) {
i = fanGetTypID(0,FAN_TYPE_CTRL_S);
fanSetSpeed(i, ack_value());
fanSetRcvSpeed(i, ack_value());
fanSpeedQuerySetWait(false);
}
if (ack_seen("I")) {
i = fanGetTypID(0,FAN_TYPE_CTRL_I);
fanSetSpeed(i, ack_value());
fanSetRcvSpeed(i, ack_value());
fanSpeedQuerySetWait(false);
}
}
Expand Down Expand Up @@ -870,7 +870,8 @@ void parseACK(void)
}
}

if (avoid_terminal != true){
if (avoid_terminal != true)
{
sendGcodeTerminalCache(dmaL2Cache, TERMINAL_ACK);
}
}
Expand Down
Loading