void LCD_1602_RUS::print(int code, bool spec) { uint8_t arr[8]; switch(code) { case 1: //Знак колокольчика memcpy_PF(arr, (uint32_t)zn_kol, 8); CharSetToLCD((uint8_t *)arr, &index_zn_kol); break; } cursor_col++; }
void LCD_1602_RUS::print(const wchar_t *_str){ uint8_t rus_[8]; int current_char = 0; int size = 0; //Определяем длину строки (количество символов) while(_str[size] != 0) { size++; } while(current_char < size) { switch(_str[current_char]) { //Русский алфавит, требующий новых символов //Единовременно может быть заменено только 8 символов //{ case 1041: //Б memcpy_PF(rus_, (uint32_t)rus_B, 8); CharSetToLCD((uint8_t *)rus_, &index_rus_B); break; case 1043: //Г memcpy_PF(rus_, (uint32_t)rus_G, 8); CharSetToLCD((uint8_t *)rus_, &index_rus_G); break; case 1044: //Д memcpy_PF(rus_, (uint32_t)rus_D, 8); CharSetToLCD((uint8_t *)rus_, &index_rus_D); break; case 1046: //Ж memcpy_PF(rus_, (uint32_t)rus_ZH, 8); CharSetToLCD((uint8_t *)rus_, &index_rus_ZH); break; case 1047: //З memcpy_PF(rus_, (uint32_t)rus_Z, 8); CharSetToLCD((uint8_t *)rus_, &index_rus_Z); break; case 1048: //И memcpy_PF(rus_, (uint32_t)rus_I, 8); CharSetToLCD((uint8_t *)rus_, &index_rus_I); break; case 1049: //Й memcpy_PF(rus_, (uint32_t)rus_II, 8); CharSetToLCD((uint8_t *)rus_, &index_rus_II); break; case 1051: //Л memcpy_PF(rus_, (uint32_t)rus_L, 8); CharSetToLCD((uint8_t *)rus_, &index_rus_L); break; case 1055: //П memcpy_PF(rus_, (uint32_t)rus_P, 8); CharSetToLCD((uint8_t *)rus_, &index_rus_P); break; case 1059: //У memcpy_PF(rus_, (uint32_t)rus_U, 8); CharSetToLCD((uint8_t *)rus_, &index_rus_U); break; case 1060: //Ф memcpy_PF(rus_, (uint32_t)rus_F, 8); CharSetToLCD((uint8_t *)rus_, &index_rus_F); break; case 1062: //Ц memcpy_PF(rus_, (uint32_t)rus_TS, 8); CharSetToLCD((uint8_t *)rus_, &index_rus_TS); break; case 1063: //Ч memcpy_PF(rus_, (uint32_t)rus_CH, 8); CharSetToLCD((uint8_t *)rus_, &index_rus_CH); break; case 1064: //Ш memcpy_PF(rus_, (uint32_t)rus_SH, 8); CharSetToLCD((uint8_t *)rus_, &index_rus_SH); break; case 1065: //Щ memcpy_PF(rus_, (uint32_t)rus_SCH, 8); CharSetToLCD((uint8_t *)rus_, &index_rus_SCH); break; case 1066: //Ъ memcpy_PF(rus_, (uint32_t)rus_tverd, 8); CharSetToLCD((uint8_t *)rus_, &index_rus_tverd); break; case 1067: //Ы memcpy_PF(rus_, (uint32_t)rus_Y, 8); CharSetToLCD((uint8_t *)rus_, &index_rus_Y); break; case 1068: //Ь memcpy_PF(rus_, (uint32_t)rus_myagk, 8); CharSetToLCD((uint8_t *)rus_, &index_rus_myagk); break; case 1069: //Э memcpy_PF(rus_, (uint32_t)rus_EE, 8); CharSetToLCD((uint8_t *)rus_, &index_rus_EE); break; case 1070: //Ю memcpy_PF(rus_, (uint32_t)rus_YU, 8); CharSetToLCD((uint8_t *)rus_, &index_rus_YU); break; case 1071: //Я memcpy_PF(rus_, (uint32_t)rus_YA, 8); CharSetToLCD((uint8_t *)rus_, &index_rus_YA); break; case 1073: //б memcpy_PF(rus_, (uint32_t)rus_b, 8); CharSetToLCD((uint8_t *)rus_, &index_rus_b); break; case 1074: //в memcpy_PF(rus_, (uint32_t)rus_v, 8); CharSetToLCD((uint8_t *)rus_, &index_rus_v); break; case 1075: //г memcpy_PF(rus_, (uint32_t)rus_g, 8); CharSetToLCD((uint8_t *)rus_, &index_rus_g); break; case 1076: //д memcpy_PF(rus_, (uint32_t)rus_d, 8); CharSetToLCD((uint8_t *)rus_, &index_rus_d); break; case 1105: //ё memcpy_PF(rus_, (uint32_t)rus_yo, 8); CharSetToLCD((uint8_t *)rus_, &index_rus_yo); break; case 1078: //ж memcpy_PF(rus_, (uint32_t)rus_zh, 8); CharSetToLCD((uint8_t *)rus_, &index_rus_zh); break; case 1079: //з memcpy_PF(rus_, (uint32_t)rus_z, 8); CharSetToLCD((uint8_t *)rus_, &index_rus_z); break; case 1080: //и memcpy_PF(rus_, (uint32_t)rus_i, 8); CharSetToLCD((uint8_t *)rus_, &index_rus_i); break; case 1081: //й memcpy_PF(rus_, (uint32_t)rus_ii, 8); CharSetToLCD((uint8_t *)rus_, &index_rus_ii); break; case 1082: //к memcpy_PF(rus_, (uint32_t)rus_k, 8); CharSetToLCD((uint8_t *)rus_, &index_rus_k); break; case 1083: //л memcpy_PF(rus_, (uint32_t)rus_l, 8); CharSetToLCD((uint8_t *)rus_, &index_rus_l); break; case 1084: //м memcpy_PF(rus_, (uint32_t)rus_m, 8); CharSetToLCD((uint8_t *)rus_, &index_rus_m); break; case 1085: //н memcpy_PF(rus_, (uint32_t)rus_n, 8); CharSetToLCD((uint8_t *)rus_, &index_rus_n); break; case 1087: //п memcpy_PF(rus_, (uint32_t)rus_p, 8); CharSetToLCD((uint8_t *)rus_, &index_rus_p); break; case 1090: //т memcpy_PF(rus_, (uint32_t)rus_t, 8); CharSetToLCD((uint8_t *)rus_, &index_rus_t); break; case 1092: //ф memcpy_PF(rus_, (uint32_t)rus_f, 8); CharSetToLCD((uint8_t *)rus_, &index_rus_f); break; case 1094: //ц memcpy_PF(rus_, (uint32_t)rus_ts, 8); CharSetToLCD((uint8_t *)rus_, &index_rus_ts); break; case 1095: //ч memcpy_PF(rus_, (uint32_t)rus_ch, 8); CharSetToLCD((uint8_t *)rus_, &index_rus_ch); break; case 1096: //ш memcpy_PF(rus_, (uint32_t)rus_sh, 8); CharSetToLCD((uint8_t *)rus_, &index_rus_sh); break; case 1097: //щ memcpy_PF(rus_, (uint32_t)rus_sch, 8); CharSetToLCD((uint8_t *)rus_, &index_rus_sch); break; case 1098: //ъ memcpy_PF(rus_, (uint32_t)rus_tverd_mal, 8); CharSetToLCD((uint8_t *)rus_, &index_rus_tverd_mal); break; case 1099: //ы memcpy_PF(rus_, (uint32_t)rus_y, 8); CharSetToLCD((uint8_t *)rus_, &index_rus_y); break; case 1100: //ь memcpy_PF(rus_, (uint32_t)rus_myagk_mal, 8); CharSetToLCD((uint8_t *)rus_, &index_rus_myagk_mal); break; case 1101: //э memcpy_PF(rus_, (uint32_t)rus_ee, 8); CharSetToLCD((uint8_t *)rus_, &index_rus_ee); break; case 1102: //ю memcpy_PF(rus_, (uint32_t)rus_yu, 8); CharSetToLCD((uint8_t *)rus_, &index_rus_yu); break; case 1103: //я memcpy_PF(rus_, (uint32_t)rus_ya, 8); CharSetToLCD((uint8_t *)rus_, &index_rus_ya); break; //} //Русский алфавит, использующий одинаковые с английским алфавитом символы //{ case 1040: //А LiquidCrystal_I2C::print("A"); break; case 1042: //В LiquidCrystal_I2C::print("B"); break; case 1045: //Е LiquidCrystal_I2C::print("E"); break; case 1025: //Ё LiquidCrystal_I2C::print("E"); break; case 1050: //К LiquidCrystal_I2C::print("K"); break; case 1052: //M LiquidCrystal_I2C::print("M"); break; case 1053: //H LiquidCrystal_I2C::print("H"); break; case 1054: //O LiquidCrystal_I2C::print("O"); break; case 1056: //P LiquidCrystal_I2C::print("P"); break; case 1057: //C LiquidCrystal_I2C::print("C"); break; case 1058: //T LiquidCrystal_I2C::print("T"); break; case 1061: //X LiquidCrystal_I2C::print("X"); break; case 1072: //а LiquidCrystal_I2C::print("a"); break; case 1077: //е LiquidCrystal_I2C::print("e"); break; case 1086: //o LiquidCrystal_I2C::print("o"); break; case 1088: //p LiquidCrystal_I2C::print("p"); break; case 1089: //c LiquidCrystal_I2C::print("c"); break; case 1091: //y LiquidCrystal_I2C::print("y"); break; case 1093: //x LiquidCrystal_I2C::print("x"); break; case 0x00B0: //Знак градуса LiquidCrystal_I2C::write(223); break; //} //Английский алфавит без изменения default: LiquidCrystal_I2C::print((char)_str[current_char]); break; } current_char++; cursor_col++; } }
void tftp_handle_packet(void) { /* * overwrite udp connection information (i.e. take from incoming packet) */ uip_ipaddr_copy(uip_udp_conn->ripaddr, BUF->srcipaddr); uip_udp_conn->rport = BUF->srcport; /* * care for incoming tftp packet now ... */ uint16_t i; flash_base_t base; struct tftp_hdr *pk = uip_appdata; switch(HTONS(pk->type)) { #ifndef TFTP_UPLOAD_ONLY /* * streaming data back to the client (download) ... */ case 1: /* read request */ uip_udp_conn->appstate.tftp.download = 1; uip_udp_conn->appstate.tftp.transfered = 0; uip_udp_conn->appstate.tftp.finished = 0; bootload_delay = 0; /* Stop bootloader. */ goto send_data; case 4: /* acknowledgement */ if(uip_udp_conn->appstate.tftp.download != 1) goto error_out; if(HTONS(pk->u.ack.block) < uip_udp_conn->appstate.tftp.transfered || (HTONS(pk->u.ack.block) > uip_udp_conn->appstate.tftp.transfered + 1)) goto error_out; /* ack out of order */ uip_udp_conn->appstate.tftp.transfered = HTONS(pk->u.ack.block); send_data: if(uip_udp_conn->appstate.tftp.finished) { bootload_delay = CONF_BOOTLOAD_DELAY; /* Restart bootloader. */ return; /* nothing more to do */ } pk->type = HTONS(3); /* data packet */ pk->u.data.block = HTONS(uip_udp_conn->appstate.tftp.transfered + 1); base = TFTP_BLOCK_SIZE * uip_udp_conn->appstate.tftp.transfered; /* base overflowed ! */ #if FLASHEND == UINT16_MAX if(uip_udp_conn->appstate.tftp.transfered && base == 0) #else if(base > FLASHEND) #endif { uip_udp_send(4); /* send empty packet to finish transfer */ uip_udp_conn->appstate.tftp.finished = 1; return; } #if FLASHEND > UINT16_MAX memcpy_PF(pk->u.data.data, (uint_farptr_t)base, TFTP_BLOCK_SIZE); #else memcpy_P(pk->u.data.data, (PGM_VOID_P)base, TFTP_BLOCK_SIZE); #endif uip_udp_send(4 + TFTP_BLOCK_SIZE); uip_udp_conn->appstate.tftp.transfered ++; break; #endif /* not TFTP_UPLOAD_ONLY */ /* * streaming data from the client (firmware upload) ... */ case 2: /* write request */ uip_udp_conn->appstate.tftp.download = 0; uip_udp_conn->appstate.tftp.transfered = 0; uip_udp_conn->appstate.tftp.finished = 0; pk->u.ack.block = HTONS(0); goto send_ack; case 3: /* data packet */ bootload_delay = 0; /* Stop bootloader. */ if(uip_udp_conn->appstate.tftp.download != 0) goto error_out; if(HTONS(pk->u.ack.block) < uip_udp_conn->appstate.tftp.transfered) goto error_out; /* too early */ if(HTONS(pk->u.ack.block) == uip_udp_conn->appstate.tftp.transfered) goto send_ack; /* already handled */ if(HTONS(pk->u.ack.block) > uip_udp_conn->appstate.tftp.transfered + 1) goto error_out; /* too late */ base = TFTP_BLOCK_SIZE * (HTONS(pk->u.ack.block) - 1); for(i = uip_datalen() - 4; i < TFTP_BLOCK_SIZE; i ++) pk->u.data.data[i] = 0xFF; /* EOF reached, init rest */ debug_putchar('.'); for(i = 0; i < TFTP_BLOCK_SIZE / SPM_PAGESIZE; i ++) flash_page(base + i * SPM_PAGESIZE, pk->u.data.data + i * SPM_PAGESIZE); if(uip_datalen() < TFTP_BLOCK_SIZE + 4) { uip_udp_conn->appstate.tftp.finished = 1; # ifdef TFTPOMATIC_SUPPORT bootload_delay = 1; /* ack, then start app */ # else bootload_delay = CONF_BOOTLOAD_DELAY; /* Restart bootloader. */ # endif debug_putstr("end\n"); } uip_udp_conn->appstate.tftp.transfered = HTONS(pk->u.ack.block); send_ack: pk->type = HTONS(4); uip_udp_send(4); /* send ack */ break; /* * protocol errors */ error_out: case 5: /* error */ default: pk->type = HTONS(5); /* data packet */ pk->u.error.code = HTONS(0); /* undefined error code */ pk->u.error.msg[0] = 0; /* yes, really expressive */ uip_udp_send(5); break; } }