Пример #1
0
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;
}
Пример #2
0
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;
	}
}
Пример #3
0
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;
}
Пример #4
0
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);
	}
}
Пример #5
0
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();
}