extern ssize_t io_read(IO_HANDLE f, void *d, size_t l) { io_private_t *io_ptr = f; if (!io_ptr || io_ptr->fd < 0) return errno = EBADF , -1; ssize_t r = 0; switch (io_ptr->operation) { case IO_LZMA: if (!io_ptr->lzma_init) io_do_decompress(io_ptr); r = lzma_read(io_ptr, d, l); break; case IO_ENCRYPT: r = enc_read(io_ptr, d, l); break; case IO_DEFAULT: r = ecc_read(io_ptr, d, l); break; default: errno = EINVAL; r = -1; break; } if (r >= 0 && io_ptr->hash_init) gcry_md_write(io_ptr->hash_handle, d, r); return r; }
static ssize_t lzma_read(io_private_t *c, void *d, size_t l) { lzma_action a = LZMA_RUN; c->lzma_handle.next_out = d; c->lzma_handle.avail_out = l; if (c->eof == EOF_YES) return 0; else if (c->eof == EOF_MAYBE) { a = LZMA_FINISH; goto proc_remain; } while (true) { if (c->lzma_handle.avail_in == 0) { c->lzma_handle.next_in = &c->byte; switch (enc_read(c, &c->byte, sizeof c->byte)) { case 0: a = LZMA_FINISH; break; case 1: c->lzma_handle.avail_in = 1; break; default: return -1; } } proc_remain:; lzma_ret lr; switch ((lr = lzma_code(&c->lzma_handle, a))) { case LZMA_STREAM_END: c->eof = EOF_MAYBE; case LZMA_OK: break; default: return -1; } if (c->lzma_handle.avail_out == 0 || c->eof != EOF_NO) return l - c->lzma_handle.avail_out; } }
static void menu_value_u16(uint16_t *x) { uint16_t val; char buf[9]; uint8_t done = 0; uint8_t update = 1; val = *x; sprintf(buf, "O: %05u", val); LCD_cursor(0, 0); LCD_text(buf); _delay_ms(100); while (done==0) { if (update == 1) { update = 0; sprintf(buf, "N: %05u", val); LCD_cursor(1, 0); LCD_text(buf); } uint8_t event = enc_read(); // check encoder if (event == ENC_UP) { val++; update = 1; } else if (event == ENC_DOWN) { val--; update = 1; } // check button if (!(BUTTONS & _BV(BUT))) { done = 1; } } *x = val; }
void menu_do() { uint16_t new_pos; const struct menuitem_t *menu; // initialize menu menu_depth = 0; menu_pos_stack[menu_depth] = 0; menu_item_stack[menu_depth] = menu_main; while (1) { uint8_t event = enc_read(); // check encoder if (event == ENC_UP) { if (menu_pos_stack[menu_depth] > 0) menu_pos_stack[menu_depth]--; } else if (event == ENC_DOWN) { new_pos = menu_pos_stack[menu_depth] + 1; menu = menu_item_stack[menu_depth]; if (pgm_read_byte(&menu[new_pos].type) != MENU_LAST) menu_pos_stack[menu_depth] = new_pos; } // check button - with stupid debouncer if (!(BUTTONS & _BV(BUT))) { _delay_ms(1); while (!(BUTTONS & _BV(BUT))); menu_action(); _delay_ms(1); while (!(BUTTONS & _BV(BUT))); } menu_redraw(); _delay_ms(10); } }
static void run_reflow(uint8_t mode) { uint16_t temp = 0; int16_t target = 30; uint16_t pid_out; uint8_t done = 0; char buf[9]; pid_init(); _delay_ms(200); wdt_enable(WDTO_2S); global_time = 0; pwm_set2(255); while(done == 0) { if (max6675_ready) { max6675_ready = 0; wdt_reset(); if ((max6675_data == 0) || (max6675_data & MAX6675_TC_OPEN)) { halt_tc_open(); break; } // convert data to temp in degrees temp = MAX6675_TEMP(max6675_data); temp = temp / 4; if (mode == 0) { target = ramp_get(global_time); if (target == -1000) { done = 1; LCD_cursor(1, 0); LCD_text(" "); LCD_cursor(0, 0); LCD_text("DONE !!!"); break; } } pid_out = pid_do(temp, target); // apply new pwm, pidout limit is 4096 scale to 256 pwm_set1(pid_out >> 4); serial_write('0'); serial_write('x'); serial_write_hex(global_time >> 8); serial_write_hex(global_time& 0xff); /* serial_write(' '); serial_write('0'); serial_write('x'); serial_write_hex(max6675_data >> 8); serial_write_hex(max6675_data & 0xff);*/ serial_write(' '); serial_write('0'); serial_write('x'); serial_write_hex(temp >> 8); serial_write_hex(temp & 0xff); serial_write(' '); serial_write('0'); serial_write('x'); serial_write_hex(target >> 8); serial_write_hex(target & 0xff); serial_write(' '); serial_write('0'); serial_write('x'); serial_write_hex(pid_out >> 8); serial_write_hex(pid_out & 0xff); serial_write('\n'); } if (mode == 1) { uint8_t tmp = enc_read(); if (tmp == ENC_UP) { if (target != 0xffff) target ++; } else if (tmp == ENC_DOWN) { if (target > 20) target --; } } if (!(BUTTONS & _BV(BUT))) { LCD_cursor(0, 0); LCD_text(" USER "); LCD_cursor(1, 0); LCD_text("ABORT !!"); break; } LCD_cursor(0, 0); snprintf(buf, 9, "C: %04d", temp); LCD_text(buf); LCD_cursor(1, 0); snprintf(buf, 9, "T: %04d", target); LCD_text(buf); } // pwm to zero pwm_set1(0); pwm_set2(0); wdt_disable(); wait_blink(); }