*/
#include <stdio.h>
+#include <stdlib.h>
#include <string.h>
+#include <math.h>
#include "sim_avr.h"
#include "sim_time.h"
void * param)
{
heatpot_p p = (heatpot_p) param;
+
+ float weight = 0.0;
+
+ for (int si = 0; si < 32; si++)
+ if (p->tally[si].sid)
+ weight += p->tally[si].cost;
+
+ float delta = p->current - p->ambiant;
+ float noise = (float)((random() % 32) - 16) / 32.0;
+ delta += noise;
+
+ float cost = ((delta/2) + noise) * -weight;
+
+ if (delta < 0) {
+ cost = (-delta / 10);
+ } else {
+ cost = weight > 0 ? 0.1 : -0.1;
+ }
+ p->current += cost;
+// printf("%s w=%.3f d=%.3f c=%.3f = %.3f\n", p->name, weight, delta, cost, p->current);
+
+ avr_raise_irq(p->irq + IRQ_HEATPOT_TEMP_OUT, p->current * 256);
+
return when + p->cycle;
}
const char * name,
float ambiant )
{
+ memset(p, 0, sizeof(*p));
p->avr = avr;
strcpy(p->name, (char*)name);
p->irq = avr_alloc_irq(&avr->irq_pool, 0, IRQ_HEATPOT_COUNT, irq_names);
avr_irq_register_notify(p->irq + IRQ_HEATPOT_TALLY, heatpot_tally_in_hook, p);
- p->cycle = avr_usec_to_cycles(avr, 100000 / 1000);
+ p->cycle = avr_usec_to_cycles(avr, 100000 / 1 /*1000 */);
avr_cycle_timer_register_usec(avr, p->cycle, heatpot_evaluate_timer, p);
+ p->ambiant = p->current = ambiant;
}
void
int f = -1, ei = -1;
for (int si = 0; si < 32 && f == -1; si++)
if (p->tally[si].sid == 0)
- ei = si;
+ ei = ei == -1 ? si : ei;
else if (p->tally[si].sid == sid)
f = si;
if (f == -1) {
* these are the sources of heat and cold to register to the heatpots
*/
enum {
- TALLY_HOTEND_PWM = 1,
+ TALLY_AMBIANT = 1,
+ TALLY_HOTEND_PWM,
TALLY_HOTBED,
TALLY_HOTEND_FAN,
};
* called when the AVR change any of the pins on port B
* so lets update our buffer
*/
-void
+static void
hotbed_change_hook(
struct avr_irq_t * irq,
uint32_t value,
void * param)
+{
+// printf("%s %d\n", __func__, value);
+// pin_state = (pin_state & ~(1 << irq->irq)) | (value << irq->irq);
+ heatpot_tally(
+ &reprap.hotbed,
+ TALLY_HOTEND_PWM,
+ value ? 1.0f : 0 );
+}
+static void
+hotend_change_hook(
+ struct avr_irq_t * irq,
+ uint32_t value,
+ void * param)
+{
+// printf("%s %d\n", __func__, value);
+// pin_state = (pin_state & ~(1 << irq->irq)) | (value << irq->irq);
+ heatpot_tally(
+ &reprap.hotend,
+ TALLY_HOTBED,
+ value ? 1.0f : 0 );
+}
+static void
+hotend_fan_change_hook(
+ struct avr_irq_t * irq,
+ uint32_t value,
+ void * param)
{
printf("%s %d\n", __func__, value);
// pin_state = (pin_state & ~(1 << irq->irq)) | (value << irq->irq);
+ heatpot_tally(
+ &reprap.hotend,
+ TALLY_HOTEND_FAN,
+ value ? -0.05 : 0 );
}
heatpot_init(avr, &r->hotend, "hotend", 28.0f);
heatpot_init(avr, &r->hotbed, "hotbed", 25.0f);
+ heatpot_tally(&r->hotend, TALLY_AMBIANT, -0.5f);
+ heatpot_tally(&r->hotbed, TALLY_AMBIANT, -0.3f);
+
/* connect heatpot temp output to thermistors */
avr_connect_irq(r->hotend.irq + IRQ_HEATPOT_TEMP_OUT,
r->therm_hotend.irq + IRQ_TERM_TEMP_VALUE_IN);
avr_connect_irq(r->hotbed.irq + IRQ_HEATPOT_TEMP_OUT,
r->therm_hotbed.irq + IRQ_TERM_TEMP_VALUE_IN);
+ avr_irq_register_notify(
+ get_ardu_irq(avr, HEATER_0_PIN, arduidiot_644),
+ hotend_change_hook, NULL);
+ avr_irq_register_notify(
+ get_ardu_irq(avr, FAN_PIN, arduidiot_644),
+ hotend_fan_change_hook, NULL);
+ avr_irq_register_notify(
+ get_ardu_irq(avr, HEATER_BED_PIN, arduidiot_644),
+ hotbed_change_hook, NULL);
+
+ //avr_irq_register_notify()
float axis_pp_per_mm[4] = DEFAULT_AXIS_STEPS_PER_UNIT; // from Marlin!
{
avr_irq_t * e = get_ardu_irq(avr, X_ENABLE_PIN, arduidiot_644);