You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
130 lines
2.7 KiB
130 lines
2.7 KiB
/* profile.c */ |
|
|
|
#include <stddef.h> |
|
#include <string.h> |
|
#include <avr/io.h> |
|
#include <avr/pgmspace.h> |
|
#include <util/atomic.h> |
|
|
|
#include "common.h" |
|
#include "profile.h" |
|
#include "menu.h" |
|
#include "config.h" |
|
#include "fields.h" |
|
#include "therm.h" |
|
|
|
const profile_t profiles[2] PROGMEM = { |
|
// { "123456789012345678901", 250, |
|
// { "Lead free solder ", 250 + 2732, { |
|
{ "NoPb ", 250 + 2732, { |
|
{ 1500 + 2732, 100, 0 }, |
|
{ 2000 + 2732, 100, 0 }, |
|
{ 2500 + 2732, 40, 0 }, |
|
{ 2500 + 2732, 30, 0 }, |
|
{ 1000 + 2732, 30, 0 }, |
|
{ 0 + 2732, 0, 0 } |
|
} }, |
|
// { "Leaded solder ", 250 + 2732, { |
|
{ "Pb ", 250 + 2732, { |
|
{ 1000 + 2732, 100, 0 }, |
|
{ 1500 + 2732, 100, 0 }, |
|
{ 2350 + 2732, 40, 0 }, |
|
{ 2350 + 2732, 30, 0 }, |
|
{ 1000 + 2732, 30, 0 }, |
|
{ 0 + 2732, 0, 0 } |
|
} } |
|
}; |
|
|
|
profile_t profile; |
|
profile_t *profile_p = &profile; |
|
uint8_t current_profile; |
|
|
|
void profile_select(uint8_t n) |
|
{ |
|
current_profile = n; |
|
memcpy_P(&profile, &profiles[n], sizeof(profile_t)); |
|
} |
|
|
|
void profile_save(void) |
|
{ |
|
// memcpy(&profiles[current_profile], profile_p, sizeof(profile_t)); |
|
} |
|
|
|
|
|
#if 0 |
|
static void select_profile_fields(uint8_t row) |
|
{ |
|
memcpy(field_values, profiles[row].name, PROFILE_NAME_LENGTH); |
|
} |
|
#endif |
|
|
|
void set_profile_temperature(temp_t temp) |
|
{ |
|
uint8_t row = field_row; |
|
|
|
if (row > 1) |
|
profile_p->lines[row-2].temperature = temp; |
|
else |
|
profile_p->start_temp = temp; |
|
} |
|
|
|
temp_t get_profile_temperature(uint8_t row) |
|
{ |
|
if (row > 1) |
|
return profile_p->lines[row-2].temperature; |
|
else |
|
return profile_p->start_temp; |
|
} |
|
|
|
void set_profile_time(uint8_t row, uint16_t time, uint8_t time_units) |
|
{ |
|
profile_p->lines[row].time = time; |
|
profile_p->lines[row].time_units = time_units; |
|
} |
|
|
|
uint16_t profile_get_time(uint8_t line) |
|
{ |
|
return profile_p->lines[line].time; |
|
} |
|
|
|
uint8_t profile_get_time_units(uint8_t row) |
|
{ |
|
return profile_p->lines[row].time_units; |
|
} |
|
|
|
uint32_t profile_time(uint8_t line) |
|
{ |
|
uint32_t time = profile_get_time(line); |
|
uint8_t time_units = profile_get_time_units(line); |
|
while (time_units--) |
|
time = time * 60; |
|
|
|
return time; |
|
} |
|
|
|
temp_t temperature_at_time(uint32_t time) { |
|
uint32_t time0, time1; |
|
temp_t temp0, temp1; |
|
uint8_t i; |
|
|
|
temp1 = get_profile_temperature(1); |
|
time1 = 0; |
|
|
|
for (i = 0; i < 6; i++) { |
|
uint32_t ptime; |
|
temp0 = temp1; |
|
time0 = time1; |
|
ptime = profile_time(i); |
|
if (ptime > 0) { |
|
temp1 = get_profile_temperature(2+i); |
|
time1 += ptime; |
|
} |
|
if (time <= time1) |
|
break; |
|
} |
|
|
|
if (time > time1) |
|
return INVALID_TEMPERATURE; |
|
|
|
return temp0 + ((int32_t)temp1 - (int32_t)temp0) * (int32_t)(time - time0) / (int32_t)(time1 - time0); |
|
}
|
|
|