// 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) ; }
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 ; }
/* 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) ; }