/** * Écrit une chaîne à l'index désiré, en effaçant tout avant ou non. * * @param msg Message à écrire (chaîne ASCIIZ composée du jeu de l'afficheur) * @param index Index où écrire le message (0 à 31) * @param cb Effacer tout le contenu affiché avant */ void LCM::write(const char* msg, const uint8_t index, const bool cb) { if (msg == NULL) { return; } uint8_t msg_len = cp_strlen(msg), // Taille totale de la chaîne up_len = 0, // Taille de la sous-chaîne sur la première ligne i; // Désactiver le `blink'/curseur pendant l'ajout (esthétique) const bool blink_en_bkup = _blink_en, cur_en_bkup = _cur_en; en_blink(false); en_cur(false); if (cb) { clear(); } if (index >= LCM_FW_TOT_CH || LCM_FW_TOT_CH - index < msg_len) { return; } if (index < LCM_FW_HALF_CH) { if (msg_len + index < LCM_LINE1_ADR + LCM_FW_HALF_CH) { up_len = msg_len; } else { up_len = LCM_FW_HALF_CH - index; } lcmd_ddr_set_addr(index + LCM_LINE1_ADR, _port); for (i = 0; i < up_len; ++i) { lcmd_write(msg[i], _port); } lcmd_ddr_set_addr(LCM_LINE2_ADR, _port); for (i = up_len; i < msg_len; ++i) { lcmd_write(msg[i], _port); } } else { lcmd_ddr_set_addr(index + LCM_LINE2_ADR - LCM_FW_HALF_CH, _port); for (i = 0; i < msg_len; ++i) { lcmd_write(msg[i], _port); } } // Réactiver le `blink'/curseur set_bc_index(_last_bc_index); en_blink(blink_en_bkup); en_cur(cur_en_bkup); // Ajuster l'index virtuel _last_index = index + msg_len; }
void hd44780fw_write(struct hd44780fw_conf* conf, const char* msg, uint8_t index, uint8_t cb) { uint8_t msg_len = cp_strlen(msg); hd44780fw_write_len(conf, msg, msg_len, index, cb); }