long CDR__readTrack(unsigned char *time) { // SysPrintf("start CDR_readTrack()\r\n"); // printf("readTrack at %02d:%02d:%02d\n", BCDToInt(time[0]), BCDToInt(time[1]), BCDToInt(time[2])); // cdrom_reinit(); seekSector(BCDToInt(time[0]), BCDToInt(time[1]), BCDToInt(time[2])); // SysPrintf("end CDR_readTrack()\r\n"); return 0; }
long CDR_readTrack(unsigned char *tr) { int m = BCDToInt( tr[0] ); int s = BCDToInt( tr[1] ); int f = BCDToInt( tr[2] ); s -= 2; if (s < 0) { s += secondsPerMinute; m --; } // printf("CDR_readTrack(%d:%02d:%02d); 0x%08x\n", m, s, f, m * bytesPerMinute + s * bytesPerSecond + f * bytesPerFrame); CDRseek(m, s, f); return 0; }
int PCF8583::GetSeconds(void) { /* uint8_t bcdsecs = FetchReg(SecondsRegAddr); DigitalOut myled(LED4); myled = 1; uint8_t secs = BCDToInt(bcdsecs); wait(0.2); myled = 0; return secs; */ return (BCDToInt(FetchReg(SecondsRegAddr))); }
// sets this MSF time based on format. format tells the order of the // frame, min and sec in the char* and whether or not it's integer or BCD inline void setMSF(const unsigned char* msf, const TDTNFormat format) { if (format == msfbcd) { minute = BCDToInt(msf[0]); sec = BCDToInt(msf[1]); frame = BCDToInt(msf[2]); } else if (format == msfint) { minute = msf[0]; sec = msf[1]; frame = msf[2]; } else if (format == fsmbcd) { minute = BCDToInt(msf[2]); sec = BCDToInt(msf[1]); frame = BCDToInt(msf[0]); } else if (format == fsmint) { minute = msf[2]; sec = msf[1]; frame = msf[0]; } }
///定时线程,需要连接跳线 USER_FUNC void time_fdthread(void *arg) { while(1) { ///第一步:读时钟模块上的时间值 hfuart_send(huart, query_time_cmd, sizeof(query_time_cmd), 0); msleep(500); if (hfuart_recv(huart, recv_timebuf, sizeof(recv_timebuf), 0) > 0) { memset(time_str, 0, sizeof(time_str)); hour = BCDToInt(recv_timebuf[0]); ///将BCD码转成十进制的时 min = BCDToInt(recv_timebuf[1]); time_str[0] = (hour / 10) + 48; ///数字到字符 time_str[1] = (hour % 10) + 48; time_str[2] = ':'; time_str[3] = (min / 10) + 48; time_str[4] = (min % 10) + 48; // sendto(udp_fd, time_str, sizeof(time_str), 0, (struct sockaddr *)&address, sizeof(address)); } ///第二步:取内存中设定的时间值与当前获取的时间值进行匹配 /// 备注:每次都轮询完flash中所有的时间设置,标识1~4为喂食,标识5~8为喂水,这样set和cancel不用作修改 memset(read_timed_flashbuf, 0, sizeof(read_timed_flashbuf)); hfuflash_read(0, read_timed_flashbuf, sizeof(read_timed_flashbuf)); if (read_timed_flashbuf[1] == ',') ///如果不空 { ///2.1 分割整个竖线连接的字符串read_timed_flashbuf数组 p_timed_str = strtok(read_timed_flashbuf, "|"); n_timed = 0; while(p_timed_str) { timed_flash_set_str[n_timed] = p_timed_str; n_timed++; p_timed_str = strtok(NULL, "|"); } ///2.2 匹配时间并喂食,将需要连接的字符串标识存入存储数组中 k_timed = -1; memset(store_timed_flashbuf, 0, sizeof(store_timed_flashbuf)); while(k_timed < (n_timed - 1)) { k_timed++; memset(timed_cmpbuf, 0, sizeof(timed_cmpbuf)); strcpy(timed_cmpbuf, timed_flash_set_str[k_timed]); ///timed_flash_set_str[0 - (n_timed-1)]的格式为:1,08:30,1,3 // u_printf("timed_cmpbuf is: %s\n", timed_cmpbuf); ///以","分割timed_cmpbuf k_cmd = 0; p_cmd = strtok(timed_cmpbuf, ","); while(p_cmd) { everyTimeCmd[k_cmd] = p_cmd; k_cmd++; p_cmd = strtok(NULL, ","); } ///取everyTimeCmd[1]中时间值与时钟模块time_str比较 if (strcmp(time_str, everyTimeCmd[1]) == 0) { sendto(udp_fd, "Got it", sizeof("Got it"), 0, (struct sockaddr *)&address, sizeof(address)); //注:此处添加定时喂食、喂水的判断 control_feed[3]=(char)(atoi(everyTimeCmd[3]) * 5); hfuart_send(huart, control_feed, sizeof(control_feed), 0); if (strcmp(everyTimeCmd[2], "1") == 0) { continue; } } ///连接字符串 strcat(store_timed_flashbuf, timed_flash_set_str[k_timed]); strcat(store_timed_flashbuf, vertLine); } ///写进flash中 hfuflash_erase_page(0,1); hfuflash_write(0, store_timed_flashbuf, sizeof(store_timed_flashbuf)); sendto(udp_fd, "Only pet(A496): ", sizeof("Only pet(A496): "), 0, (struct sockaddr *)&address, sizeof(address)); sendto(udp_fd, store_timed_flashbuf, sizeof(store_timed_flashbuf), 0, (struct sockaddr *)&address, sizeof(address)); } sleep(75); ///保证每分钟轮询一次 } }
int PCF8583::GetHours(void) { return (BCDToInt(0x3F & FetchReg(HoursRegAddr))); }
int PCF8583::GetMinuites(void) { return (BCDToInt(FetchReg(MinuitesRegAddr))); }