//---------------------------------------------------------------------------
// Проект 45. Пакет с преамбулой и CRC-8
// Формат: преамбула, длина, данные, CRC-8.
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
{
}
//---------------------------------------------------------------------------

// Простой протокол поверх любого канала: преамбула 0xAA, длина, данные и
// CRC-8 (полином 0x07). crc8 — ядро, проверяется тестом.
unsigned char crc8(const unsigned char *p, int len)
{
    unsigned char crc=0;
    for (int i=0;i<len;i++){
        crc ^= p[i];
        for (int k=0;k<8;k++)
            crc = (crc & 0x80) ? (crc<<1)^0x07 : (crc<<1);
    }
    return crc;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ButtonBuildClick(TObject *Sender)
{
    // данные вводятся как hex-байты через пробел
    unsigned char data[64]; int n=0;
    TStringList *parts=new TStringList();
    try {
        parts->Delimiter=' '; parts->DelimitedText=EditData->Text;
        for (int i=0;i<parts->Count && n<64;i++){
            AnsiString t=parts->Strings[i].Trim();
            if (!t.IsEmpty()) data[n++]=(unsigned char)StrToIntDef("0x"+t,0);
        }
    } __finally { delete parts; }

    unsigned char pkt[70]; int k=0;
    pkt[k++]=0xAA;                    // преамбула
    pkt[k++]=(unsigned char)n;        // длина
    for (int i=0;i<n;i++) pkt[k++]=data[i];
    pkt[k++]=crc8(pkt+1, n+1);        // CRC по длине и данным

    AnsiString hex;
    for (int i=0;i<k;i++) hex+=IntToHex((int)pkt[i],2)+" ";
    MemoOut->Text="Пакет ("+IntToStr(k)+" байт): "+hex;
}
//---------------------------------------------------------------------------
