Exemple #1
0
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++;
}
Exemple #2
0
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;
    }
}