//--------------------------------------------------------------------------- #pragma hdrstop #include "VMSCThread.h" #include "VMSCThreadSendF.h" //--------------------------------------------------------------------------- #pragma package(smart_init) /* * ¼Û½Å ÆÐŶ ó¸® * arguments * void * return * void */ int __fastcall TVMSCThread::ProcessSendPacket(BYTE AOpCode, COMMAND_ARGUMENT *AArg) { FErrLine = 10; VMS_PACKET *Pkt = (VMS_PACKET*)m_TxBuff; int result = SYS_ERR_NONE; int nData = 0; int sndLen = 0; unsigned crc; unsigned short year, mon, day; unsigned short hour, min, sec, msec; Now().DecodeDate(&year, &mon, &day); Now().DecodeTime(&hour, &min, &sec, &msec); Pkt->hd.STX = VMS_STX; // STX, 0x02 Pkt->hd.ID = 0x00; // Reserved, 0x00 Pkt->hd.OpCode = AOpCode; // OpCode sprintf(Pkt->hd.ADDR, "%04d", FVmsObj->Id); // Address switch(AOpCode) { case REQ_VMS_STATUS:// 0x50 // Status ¿äû, ¼¾ÅÍ->VMS Pkt->data[nData++] = (BYTE)HIBYTE(year); Pkt->data[nData++] = (BYTE)LOBYTE(year); Pkt->data[nData++] = (BYTE)mon; Pkt->data[nData++] = (BYTE)day; Pkt->data[nData++] = (BYTE)hour; Pkt->data[nData++] = (BYTE)min; Pkt->data[nData++] = (BYTE)sec; break; case REQ_VMS_MSG_DOWNLOAD:// 0x51 // ¹®¾È Àü¼Û ¿äû, ¼¾ÅÍ->VMS nData = MakeMsgDownload(Pkt->data, AArg); if (nData <= 0) { LERROR(">>> MakeMsgDownload Faild"); return SYS_ERR_DATABASE; } break; case REQ_VMS_LIB_DOWNLOAD:// 0x52 // Library download ¿äû, ¼¾ÅÍ->VMS nData = MakeLibDownload(Pkt->data, AArg); if (nData <= 0) { LERROR(">>> MakeLibDownload Faild"); return SYS_ERR_DATABASE; } break; case REQ_VMS_PARAM_DOWNLOAD:// 0x53 // Parameter download ¿äû, ¼¾ÅÍ->VMS Pkt->data[nData++] = AArg->Publication.Data.Set2.DefCommErr; // Åë½ÅÀå¾Ö ±âº»°ª, Á¦¾î±â°¡ Host·ÎºÎÅÍ Poll ¶Ç´Â ¸í·ÉÀ» ¹ÞÁö ¾Ê°í °æ°úÇÒ ¼ö ÀÖ´Â ÃÖ´ë½Ã°£ (default ; 60ÃÊ) Pkt->data[nData++] = (BYTE)HIBYTE(AArg->Publication.Data.Set2.SlotCommErr); // Åë½ÅÀå¾Ö slot¹øÈ£, Åë½Å fail ½Ã Ç¥½ÃÇÒ ¸Þ½ÃÁö ¹øÈ£(default 0¹ø) Pkt->data[nData++] = (BYTE)LOBYTE(AArg->Publication.Data.Set2.SlotCommErr); // Åë½ÅÀå¾Ö slot¹øÈ£, Åë½Å fail ½Ã Ç¥½ÃÇÒ ¸Þ½ÃÁö ¹øÈ£(default 0¹ø) Pkt->data[nData++] = (BYTE)HIBYTE(AArg->Publication.Data.Set2.SlotPowerErr); // Àü¿øÀå¾Ö slot¹øÈ£, Àü¿øÀå¾Ö ½Ã Ç¥½ÃÇÒ ¸Þ½ÃÁö ¹øÈ£(default 0¹ø) Pkt->data[nData++] = (BYTE)LOBYTE(AArg->Publication.Data.Set2.SlotPowerErr); // Àü¿øÀå¾Ö slot¹øÈ£, Àü¿øÀå¾Ö ½Ã Ç¥½ÃÇÒ ¸Þ½ÃÁö ¹øÈ£(default 0¹ø) Pkt->data[nData++] = AArg->Publication.Data.Set2.NightLuminance; // ¾ß°£ ÈÖµµ °ª, 0x30 ~ 0x3F Pkt->data[nData++] = AArg->Publication.Data.Set2.DayLuminance; // ÁÖ°£ ÈÖµµ °ª, 0x40 ~ 0x4F Pkt->data[nData++] = AArg->Publication.Data.Set2.PhaseCycleTime; // phase½Ã°£ÁÖ±â, Àå¾Ö½Ã phaseÁÖ±â (default : 3ÃÊ, ¹üÀ§ : 0 ~ 10ÃÊ) Pkt->data[nData++] = AArg->Publication.Data.Set2.ModuleFailRate; // ¸ðµâÀå¾ÖÀ², ÇѰ³ÀÇ moduleÀ» Àå¾Ö·Î ó¸®Çϱâ À§ÇÑ Àå¾Ö pixel¹éºÐÀ² (default 10%) Pkt->data[nData++] = AArg->Publication.Data.Set2.ModuleCheckTime; // ¸ðµâ°¨½Ã ÁÖ±â, 0 ~ 255 (´ÜÀ§:ÃÊ) Pkt->data[nData++] = AArg->Publication.Data.Set2.BoardOnHour; // Àü±¤ÆÇ On time(½Ã), 0½Ã ~ 23½Ã Pkt->data[nData++] = AArg->Publication.Data.Set2.BoardOnMin; // Àü±¤ÆÇ On time(ºÐ), 0½Ã ~ 23½Ã Pkt->data[nData++] = AArg->Publication.Data.Set2.BoardOffHour; // Àü±¤ÆÇ Off time(½Ã), 0½Ã ~ 23½Ã Pkt->data[nData++] = AArg->Publication.Data.Set2.BoardOffMin; // Àü±¤ÆÇ Off time(ºÐ), 0½Ã ~ 23½Ã #if 0 11 Åë½ÅÀå¾Ö ±âº»°ª Á¦¾î±â°¡ Host·ÎºÎÅÍ Poll ¶Ç´Â ¸í·ÉÀ» ¹ÞÁö ¾Ê°í °æ°úÇÒ ¼ö ÀÖ´Â ÃÖ´ë½Ã°£ (default ; 60ÃÊ) 12 Åë½ÅÀå¾Ö slot¹øÈ£ Åë½Å fail ½Ã Ç¥½ÃÇÒ ¸Þ½ÃÁö ¹øÈ£(default 0¹ø) 13 14 Àü¿øÀå¾Ö slot¹øÈ£ Àü¿øÀå¾Ö ½Ã Ç¥½ÃÇÒ ¸Þ½ÃÁö ¹øÈ£(default 0¹ø) 15 16 ¾ß°£ ÈÖµµ °ª 0x30 ~ 0x3F 17 ÁÖ°£ ÈÖµµ °ª 0x40 ~ 0x4F 18 phase½Ã°£ÁÖ±â Àå¾Ö½Ã phaseÁÖ±â (default : 3ÃÊ, ¹üÀ§ : 0 ~ 10ÃÊ) 19 ¸ðµâÀå¾ÖÀ² ÇѰ³ÀÇ moduleÀ» Àå¾Ö·Î ó¸®Çϱâ À§ÇÑ Àå¾Ö pixel¹éºÐÀ² (default 10%) 20 ¸ðµâ°¨½Ã ÁÖ±â 0 ~ 255 (´ÜÀ§:ÃÊ) 21 Àü±¤ÆÇ On time(½Ã) 0½Ã ~ 23½Ã 0x00000000 : ¾øÀ½ 22 Àü±¤ÆÇ On time(ºÐ) 0ºÐ ~ 59ºÐ 23 Àü±¤ÆÇ Off time(½Ã) 0½Ã ~ 23½Ã 24 Àü±¤ÆÇ Off time(ºÐ) 0ºÐ ~ 59ºÐ #endif break; case REQ_VMS_BLANK_DISP:// 0x54 // Blank ¿äû, ¼¾ÅÍ->VMS //¼³Á¤µ¥ÀÌÅ;øÀÌ Çì´õ·Î Á¤º¸·Î Àü¼Û break; case REQ_VMS_DEF_MSG_DISP:// 0x55 // Default message display ¿äû, ¼¾ÅÍ->VMS //¼³Á¤µ¥ÀÌÅ;øÀÌ Çì´õ·Î Á¤º¸·Î Àü¼Û break; case REQ_VMS_MODULE_STATUS:// 0x56 // Module status upload ¿äû, ¼¾ÅÍ->VMS //¼³Á¤µ¥ÀÌÅ;øÀÌ Çì´õ·Î Á¤º¸·Î Àü¼Û break; case REQ_VMS_INITIALIZE:// 0x57 // Initialize ¿äû, ¼¾ÅÍ->VMS //¼³Á¤µ¥ÀÌÅ;øÀÌ Çì´õ·Î Á¤º¸·Î Àü¼Û break; case REQ_VMS_LUMINANCE_LEVEL_SET:// 0x58 // Luminance level set ¿äû, ¼¾ÅÍ->VMS Pkt->data[nData++] = AArg->Publication.Data.Ctl; break; case REQ_SIGNBOARD_POWER_CONTROL:// 0x59 // Signboard power control ¿äû, ¼¾ÅÍ->VMS Pkt->data[nData++] = AArg->Publication.Data.Ctl; break; default: LERROR(">>> Unknown ProcessSendPacket: 0x%02X", AOpCode); return SYS_ERR_UNKNOWN_COMMAND; } #if 0 BYTE STX; BYTE ID; BYTE OpCode; UINT Size; char ADDR[4]; char DATA[n]; char CRC[2]; char ETX; #endif sndLen = nData+1+1+4+4+2; // IDºÎÅÍ CRC±îÁöÀÇ Àüü ±æÀÌ(byte orderÁؼö) Pkt->hd.Size = CommUtil_swapl((DWORD)sndLen); crc = CommUtil_MakeCrc16((void*)&Pkt->hd.ID, (WORD)(sndLen-2)); //IDºÎÅÍ DATA±îÁöÀÇ CRC-16 »ý¼º´ÙÇ׽Ŀ¡ ÀÇÇØ °è»êµÈ °ª Pkt->data[nData++] = HIBYTE(crc); // CRC Pkt->data[nData++] = LOBYTE(crc); // CRC Pkt->data[nData++] = VMS_ETX; // ETX, 0x03 result = SendPacket((BYTE*)Pkt, sndLen+2); //STX+Pkt->Size+ETX return result; } //--------------------------------------------------------------------------- int __fastcall TVMSCThread::MakeMsgDownload(BYTE *ABuff, COMMAND_ARGUMENT *AArg) { int nData = 0; int nForms = 0; unsigned int nImgSize; TVmsForm *pVmsForm = NULL; AnsiString MessageId; int ii; bool bException = false; try { m_pVmsFormList->Lock(); int nFormCnt = m_pVmsFormList->Count(); if (nFormCnt > 9) nFormCnt = 9; if (nFormCnt <= 0) { SERROR("Msg Download Form Count is zero ! ! !"); return -1; } ABuff[nData++] = 0x07; // Á¤ÁöÈ­¸é (Stationary) ABuff[nData++] = 0x02; // Left(¿À¸¥ÂÊ¿¡¼­ ¿ÞÂÊÀ¸·Î) int nDispTime = FVmsObj->VMS_PHSE_CHNG_CYCL; if (FVmsObj->VMS_PHSE_CHNG_CYCL < 3) nDispTime = 3; if (FVmsObj->VMS_PHSE_CHNG_CYCL > 10) nDispTime = 10; ABuff[nData++] = (BYTE)nDispTime;//0x05; // Ç¥Ã⠽ð£/±â°£ ABuff[nData++] = (BYTE)nFormCnt-1; // PHASE °¹¼ö(0x00-1EA, 0x01 ~ 0x08=9EA) LDEBUG("Display Time: %d sec, Forms: %d", nDispTime, nFormCnt); for (int ii = 0; ii < nFormCnt; ii++) { pVmsForm = m_pVmsFormList->GetItem(ii); if (!pVmsForm) { SERROR("Msg FormId Memory Not Found: %d", ii); continue; } #if 0 LINFO(" pVmsForm->DisplayTime: %d", pVmsForm->DisplayTime); LINFO("pVmsForm->DisplayMode.ToIntDef(0): %d", pVmsForm->DisplayMode.ToIntDef(0)); LINFO(" pVmsForm->DisplayDir.ToIntDef(0): %d", pVmsForm->DisplayDir.ToIntDef(0)); LINFO(" pVmsForm->pStream->Size: %d", pVmsForm->pStream->Size); #endif nImgSize = pVmsForm->pStream->Size; ABuff[nData++] = 'G'; //G: ±×·¡ÇÈ, T: Text, B: Bar, S: Symbol ABuff[nData++] = (BYTE)(nImgSize >> 24) & 0xFFFFFFFF; ABuff[nData++] = (BYTE)(nImgSize >> 16) & 0xFFFFFFFF; ABuff[nData++] = (BYTE)(nImgSize >> 8) & 0xFFFFFFFF; ABuff[nData++] = (BYTE)(nImgSize ) & 0xFFFFFFFF; try { pVmsForm->pStream->Position = 0; memcpy((char*)&ABuff[nData], (char *)pVmsForm->pStream->Memory, nImgSize); nData += nImgSize; } catch(Exception &e) { bException = true; SERROR("MemoryStream Allocation error: %s, FormId: %s", AnsiString(e.Message).c_str(), pVmsForm->FormId.c_str()); } } } __finally { m_pVmsFormList->UnLock(); } return nData; } //--------------------------------------------------------------------------- int __fastcall TVMSCThread::MakeLibDownload(BYTE *ABuff, COMMAND_ARGUMENT *AArg) { int nData = 0; int nForms = 0; unsigned int nImgSize; TVmsForm *pVmsForm = NULL; AnsiString MessageId; int ii; bool bException = false; try { m_pVmsFormList->Lock(); int nFormCnt = m_pVmsFormList->Count(); if (nFormCnt > 9) nFormCnt = 9; if (nFormCnt <= 0) { SERROR("Msg Download Form Count is zero ! ! !"); return -1; } #if 0 ¡à LIBRARY ¸Þ½ÃÁö ¹øÈ£ÀÇ ¹üÀ§ - Text Message Number : 1000 - 5999 - Graphic Symbol Message Number : 6000 - 8999 - Full Graphic Message Number : 9000 - 9999 - Message Number 0 Àº Default Message #endif int nLibNo = 0; ABuff[nData++] = 0x07; // Á¤ÁöÈ­¸é (Stationary) ABuff[nData++] = 0x02; // Left(¿À¸¥ÂÊ¿¡¼­ ¿ÞÂÊÀ¸·Î) ABuff[nData++] = (BYTE)(nLibNo >> 8) & 0xFFFFFFFF; ABuff[nData++] = (BYTE)(nLibNo ) & 0xFFFFFFFF; ABuff[nData++] = (BYTE)nFormCnt; // PHASE °¹¼ö(0x00-1EA, 0x01 ~ 0x08=9EA) LDEBUG("Lib Download: Forms: %d", nFormCnt); for (int ii = 0; ii < nFormCnt; ii++) { pVmsForm = m_pVmsFormList->GetItem(ii); if (!pVmsForm) { SERROR("Msg FormId Memory Not Found: %d", ii); continue; } #if 0 LINFO(" pVmsForm->DisplayTime: %d", pVmsForm->DisplayTime); LINFO("pVmsForm->DisplayMode.ToIntDef(0): %d", pVmsForm->DisplayMode.ToIntDef(0)); LINFO(" pVmsForm->DisplayDir.ToIntDef(0): %d", pVmsForm->DisplayDir.ToIntDef(0)); LINFO(" pVmsForm->pStream->Size: %d", pVmsForm->pStream->Size); #endif nImgSize = pVmsForm->pStream->Size; ABuff[nData++] = 'S'; //G: ±×·¡ÇÈ, T: Text, B: Bar, S: Symbol ABuff[nData++] = (BYTE)(nImgSize >> 24) & 0xFFFFFFFF; ABuff[nData++] = (BYTE)(nImgSize >> 16) & 0xFFFFFFFF; ABuff[nData++] = (BYTE)(nImgSize >> 8) & 0xFFFFFFFF; ABuff[nData++] = (BYTE)(nImgSize ) & 0xFFFFFFFF; try { pVmsForm->pStream->Position = 0; memcpy((char*)&ABuff[nData], (char *)pVmsForm->pStream->Memory, nImgSize); nData += nImgSize; } catch(Exception &e) { bException = true; SERROR("MemoryStream Allocation error: %s, FormId: %s", AnsiString(e.Message).c_str(), pVmsForm->FormId.c_str()); } } } __finally { m_pVmsFormList->UnLock(); } return nData; } //--------------------------------------------------------------------------- /* * ÆÐŶ ¼Û½Å * arguments * void * return * void */ int __fastcall TVMSCThread::SendPacket(BYTE *ACmdBuff, int AReqSendLen) { int result = SYS_ERR_NONE; try { int nSendBytes = TcpClient->SendBuf(ACmdBuff, AReqSendLen); if (nSendBytes == AReqSendLen) { FClient.sendRetry--; FClient.sendTimer = Now(); } else { result = SYS_ERR_WRITE_LENGTH; } if (SYS_ERR_NONE == result) LogData("SEND", ACmdBuff, AReqSendLen); else LogData("SEND Fail", ACmdBuff, nSendBytes); InfoPacket(ACmdBuff, nSendBytes, true, result); } catch(Exception &e) { result = SYS_ERR_MEMORY; } return result; } //---------------------------------------------------------------------------