Example #1
0
// YX structure is set with y,x,string,length, and start position of text
// Fix from Klaus, dr Tiger
static GOOD_OR_BAD OW_Hprintyx(struct yx * YX, struct parsedname * pn)
{
	BYTE translated_data[2 + 2 * (YX->length-YX->text_start)];
	size_t original_index ;
	size_t translate_index = 0;

	int Valid_YX = ( YX->x <= LCD_LINE_END && YX->y <= LCD_LAST_ROW && YX->x >= LCD_LINE_START && YX->y >= LCD_FIRST_ROW ) ;
	int Continue_YX = ( YX->y == LCD_SAME_LOCATION_VALUE || YX->x == LCD_SAME_LOCATION_VALUE ) ;

	if ( Valid_YX ) {
		BYTE chip_command ;
		switch (YX->y) { // row value
			case 1:
				chip_command = LCD_COMMAND_SET_DDRAM_ADDRESS;
				break;
			case 2:
				chip_command = LCD_COMMAND_SET_DDRAM_ADDRESS + LCD_SECOND_ROW_ADDRESS;
				break;
			case 3:
				chip_command = LCD_COMMAND_SET_DDRAM_ADDRESS + LCD_LINE_END;
				break;
			case 4:
				chip_command = (LCD_COMMAND_SET_DDRAM_ADDRESS + LCD_SECOND_ROW_ADDRESS) + LCD_LINE_END;
				break;
			default:
				LEVEL_DEBUG("Unrecognized row %d",YX->y) ;
				return gbBAD ;
		}
		chip_command += YX->x - 1; // add column (0 index)
		// Initial location (2 half bytes)
		translated_data[translate_index++] = NIBBLE_ONE(chip_command);
		translated_data[translate_index++] = NIBBLE_TWO(chip_command);
	} else if ( !Continue_YX ) {
		LEVEL_DEBUG("Bad screen coordinates y=%d x=%d",YX->y,YX->x);
		return gbBAD;
	}
		
	//printf("Hscreen test<%*s>\n",(int)size,buf) ;
	for ( original_index = YX->text_start ; original_index < YX->length ; ++original_index ) {
		if (YX->string[original_index]) {
			translated_data[translate_index++] = NIBBLE_ONE(YX->string[original_index]) | LCD_DATA_FLAG;
			translated_data[translate_index++] = NIBBLE_TWO(YX->string[original_index]) | LCD_DATA_FLAG;
		} else {				//null byte becomes space
			translated_data[translate_index++] = NIBBLE_ONE(' ') | LCD_DATA_FLAG;
			translated_data[translate_index++] = NIBBLE_TWO(' ') | LCD_DATA_FLAG;
		}
	}
	LEVEL_DEBUG("Print the message");
	return OW_w_pios(translated_data, translate_index, pn) ;
}
Example #2
0
static GOOD_OR_BAD OW_Hinit(struct parsedname * pn)
{
	int init = 1;
	// clear, display on, mode
	BYTE start[] = { NIBBLE_ONE(LCD_COMMAND_ATTENTION), };
	BYTE next[] = {
		NIBBLE_ONE(LCD_COMMAND_ATTENTION),
		NIBBLE_ONE(LCD_COMMAND_ATTENTION),
		NIBBLE_ONE(LCD_COMMAND_4_BIT),
		NIBBLE_CTRL(LCD_COMMAND_4_BIT_2_LINES),
	};
	BYTE data[6];

	// already done?
	RETURN_GOOD_IF_GOOD( Cache_Get_SlaveSpecific(&init, sizeof(init), SlaveSpecificTag(INI), pn) )
	
	if ( BAD( OW_w_control(0x04, pn) )	// strobe
		|| BAD( OW_r_reg(data, pn) ) ) {
		LEVEL_DEBUG("Trouble sending strobe to Hobbyboard LCD") ;
		return gbBAD;
	}
	if ( data[5] != 0x84 )	{
		LEVEL_DEBUG("LCD is not powered"); // not powered
		return gbBAD ;
	}
	if ( BAD( OW_c_latch(pn) ) ) {
		LEVEL_DEBUG("Trouble clearing latches") ;
		return gbBAD ;
	}// clear PIOs
	if ( BAD( OW_w_pios(start, 1, pn) ) ) {
		LEVEL_DEBUG("Error sending initial attention");	
		return gbBAD;
	}
	UT_delay(5);
	if ( BAD( OW_w_pios(next, 5, pn) ) ) {
		LEVEL_DEBUG("Error sending setup commands");	
		return gbBAD;
	}
	Cache_Add_SlaveSpecific(&init, sizeof(init), SlaveSpecificTag(INI), pn);
	return gbGOOD ;
}
Example #3
0
/* Redefine a character */
static GOOD_OR_BAD OW_redefchar(ASCII * pattern, struct parsedname * pn)
{
	int i ;
	int j = 0;
	int char_num = pn->extension * 8 + 0x40 ;
	int datalength = 2 * (LCD_REDEFCHAR_LENGTH+1) ; // nibbles for data plus index
	BYTE data[ datalength ] ;

	RETURN_BAD_IF_BAD( OW_Hinit(pn) ) ;

	i = j = 0;
	
	// Start with char num
	data[j++] = (char_num & 0xF0);
	data[j++] = (char_num << 4) & 0xF0;

	// Add pattern
	for ( i = 0 ; i < LCD_REDEFCHAR_LENGTH ; ++i ) {
		data[j++] = NIBBLE_ONE(pattern[i]) | LCD_DATA_FLAG;
		data[j++] = NIBBLE_TWO(pattern[i]) | LCD_DATA_FLAG;
	}

	return OW_w_pios(data, datalength, pn) ;
}