#include "myWin.h" #include "stdio.h" #include "stdlib.h" #include "math.h" #include "string.h" #define LB_1 1001 #define LB_2 1002 #define ED_DT 2000 #define ED_4B 2101 #define BT_GN 3001 #define BT_CD 3002 #define STRGAP 120 typedef struct { TCHAR pre; TCHAR T[4]; TCHAR B[5]; } Tab4B3T; static TCHAR frDT[501]=TEXT("1010 1000 0101 1101 1010 0101 1101 "); static TCHAR fr4B[501]=TEXT(""); static Tab4B3T Table[]={ {CHAR('-'),TEXT("+0+"),TEXT("0000")},{CHAR('0'),TEXT("+0+"),TEXT("0000")}, {CHAR('+'),TEXT("0-0"),TEXT("0000")}, {CHAR('*'),TEXT("0-+"),TEXT("0001")}, {CHAR('*'),TEXT("+-0"),TEXT("0010")}, {CHAR('-'),TEXT("00+"),TEXT("0011")}, {CHAR('0'),TEXT("--0"),TEXT("0011")}, {CHAR('+'),TEXT("--0"),TEXT("0011")}, {CHAR('*'),TEXT("-+0"),TEXT("0100")}, {CHAR('-'),TEXT("0++"),TEXT("0101")}, {CHAR('0'),TEXT("-00"),TEXT("0101")}, {CHAR('+'),TEXT("-00"),TEXT("0101")}, {CHAR('-'),TEXT("-++"),TEXT("0110")}, {CHAR('0'),TEXT("-++"),TEXT("0110")}, {CHAR('+'),TEXT("--+"),TEXT("0110")}, {CHAR('*'),TEXT("-0+"),TEXT("0111")}, {CHAR('-'),TEXT("+00"),TEXT("1000")}, {CHAR('0'),TEXT("+00"),TEXT("1000")}, {CHAR('+'),TEXT("0--"),TEXT("1000")}, {CHAR('-'),TEXT("+-+"),TEXT("1001")}, {CHAR('0'),TEXT("+-+"),TEXT("1001")}, {CHAR('+'),TEXT("---"),TEXT("1001")}, {CHAR('-'),TEXT("++-"),TEXT("1010")}, {CHAR('0'),TEXT("+--"),TEXT("1010")}, {CHAR('+'),TEXT("+--"),TEXT("1010")}, {CHAR('*'),TEXT("+0-"),TEXT("1011")}, {CHAR('-'),TEXT("+++"),TEXT("1100")}, {CHAR('0'),TEXT("-+-"),TEXT("1100")}, {CHAR('+'),TEXT("-+-"),TEXT("1100")}, {CHAR('-'),TEXT("0+0"),TEXT("1101")}, {CHAR('0'),TEXT("-0-"),TEXT("1101")}, {CHAR('+'),TEXT("-0-"),TEXT("1101")}, {CHAR('*'),TEXT("0+-"),TEXT("1110")}, {CHAR('-'),TEXT("++0"),TEXT("1111")}, {CHAR('0'),TEXT("++0"),TEXT("1111")}, {CHAR('+'),TEXT("00-"),TEXT("1111")} }; static HWND btGen, btCode, btDraw, label, edDT, ed4B; static HDC hbuf; static HBITMAP hBM; static int startX=0; void clearBitmap(){ SelectObject(hbuf,GetStockObject(NULL_PEN)); PatBlt(hbuf,0,0,1000,1000,WHITENESS); } void initBitMap(HWND hw){// ビットマップ作成とメモリデバイスコンテキスト作成 HDC hdc=GetDC(hw); hBM=CreateCompatibleBitmap(hdc,1000,1000); hbuf=CreateCompatibleDC(hdc);SelectObject(hbuf,hBM); clearBitmap(); ReleaseDC(hw, hdc); } void createLabel(HWND *label,HWND hw, TCHAR name[],int X, int Y, int W,int H, int No){ *label=CreateWindow(TEXT("STATIC"),name, WS_CHILD|WS_VISIBLE|SS_LEFT, X,Y, W, H,hw,(HMENU)No,hInstance,NULL); } void createEdit(HWND *edit,HWND hw, TCHAR name[],int X, int Y, int W,int H, int No){ *edit= CreateWindow(TEXT("EDIT"),name, WS_CHILD|WS_VISIBLE|WS_BORDER|ES_LEFT, X,Y, W, H,hw,(HMENU)No,hInstance,NULL); } void createButton(HWND *edit,HWND hw, TCHAR name[],int X, int Y, int W,int H, int No){ *edit=CreateWindow(TEXT("BUTTON"),name, WS_CHILD|WS_VISIBLE|WS_BORDER|BS_PUSHBUTTON, X,Y, W, H,hw,(HMENU)No,hInstance,NULL); } void procPaint(HWND hw, WPARAM wp, LPARAM lp){// ビットマップを画面に表示 PAINTSTRUCT ps; HDC hdc=BeginPaint(hw, &ps); BitBlt(hdc,0,0,1000,1000,hbuf,0,0,SRCCOPY); EndPaint(hw,&ps); } int getCode(TCHAR DT[],int k){//4B3T符号取り出し TCHAR PRE=CHAR('0'); if(k>1) PRE=fr4B[k-2]; for(int i=0;i<36; i++){ if(Table[i].pre==CHAR('*')||Table[i].pre==PRE){ if(lstrcmp(Table[i].B, DT)==0){ for(int j=0; j<3; j++) fr4B[k++]=Table[i].T[j]; fr4B[k++]=TCHAR(' '); fr4B[k]=0; return k; } } } MessageBox(NULL,TEXT("変換エラー"),TEXT("Error"),MB_OK); return -1; } void procDraw(HWND hw); void procGenCode(HWND hw){//4B3T符号の生成 TCHAR DT[5];TCHAR DT0[5]=TEXT("0000"); lstrcpy(DT,DT0); GetWindowText(edDT,frDT,500);int j=0,k=0; for(int i=0; frDT[i]; i++) if(frDT[i]==CHAR('0')|| frDT[i]==CHAR('1')){ DT[j++]=frDT[i]; if(j==4) { if((k=getCode(DT,k))<0){SetWindowText(ed4B,fr4B); return;} j=0; lstrcpy(DT,DT0); } } if(j>0) k=getCode(DT,k); SetWindowText(ed4B,fr4B); procDraw(hw); } int checkCode(TCHAR DT[],int k){//4B3T符号のチェック DT[3]=0; for(int i=0;i<36; i++){ if(lstrcmp(Table[i].T, DT)==0){ for(int j=0; j<4; j++) frDT[k++]=Table[i].B[j]; frDT[k++]=TCHAR(' '); frDT[k]=0; return k; } } MessageBox(NULL,TEXT("逆変換エラー"),TEXT("Error"),MB_OK); return -1; } void procCheckCode(HWND hw){//バイナリコードへの逆変換 TCHAR DT[5];TCHAR DT0[5]=TEXT(""); lstrcpy(DT,DT0); GetWindowText(ed4B,fr4B,500);int j=0,k=0; for(int i=0; fr4B[i]; i++) if(fr4B[i]==CHAR('0')|| fr4B[i]==CHAR('+')|| fr4B[i]==CHAR('-')){ DT[j++]=fr4B[i]; if(j==3) { j=0; if((k=checkCode(DT,k))<0){ MessageBox(hw, frDT,TEXT("check"),MB_OK); return; } } } if(j>0) k=checkCode(DT,k); MessageBox(hw, frDT,TEXT("check"),MB_OK); procDraw(hw); } int drawPulse(int X,int Y, int DX){ LineTo (hbuf,X, Y);X+=DX;LineTo (hbuf,X, Y); return X; } int drawPulse2(int X,int Y1, int Y2, int DX){ LineTo (hbuf,X, Y1);X+=DX;LineTo (hbuf,X, Y1); LineTo (hbuf,X, Y2);X+=DX;LineTo (hbuf,X, Y2); return X; } HPEN startPulse(TCHAR str[], int X, int Y){ TextOut(hbuf, X,Y-15, str, lstrlen(str)); X += STRGAP; HPEN hpen=CreatePen(PS_SOLID,1,0xFF0000); SelectObject(hbuf, hpen); MoveToEx(hbuf,X, Y,NULL);LineTo (hbuf,X+500, Y); DeleteObject(hpen); hpen=CreatePen(PS_SOLID,2,0xFF); SelectObject(hbuf, hpen); MoveToEx(hbuf,X, Y,NULL); return hpen; } void NRZunipolarSignal(TCHAR DT[], TCHAR str[], int X, int Y){//単流NRZ HPEN hpen = startPulse(str,X,Y);X += STRGAP; for(int i=0; DT[i]!=0;i++) if (DT[i]==TCHAR('0')) X=drawPulse(X,Y,10); else if(DT[i]==TCHAR('1')) X=drawPulse(X,Y-10,10); LineTo (hbuf,X, Y); DeleteObject(hpen); } void mB1C(TCHAR DT[], TCHAR str[], int X, int Y){//8B1C HPEN hpen = startPulse(str,X,Y);X += STRGAP; int j=0, iflag=0; for(int i=0; DT[i]!=0;i++){ if (DT[i]==TCHAR('0')) X=drawPulse(X,Y,10); else if(DT[i]==TCHAR('1')) X=drawPulse(X,Y-10,10); if(DT[i]==TCHAR('0')|| DT[i]==TCHAR('1')){ int j8= j % 8; if(j8==6) iflag=(DT[i]==TCHAR('0') ? 10 : 0); else if(j8==7) X=drawPulse(X,Y-iflag,10); j++; } } LineTo (hbuf,X, Y); DeleteObject(hpen); } void NRZdipolarSignal(TCHAR DT[], TCHAR str[], int X, int Y){//複流NRZ HPEN hpen = startPulse(str,X,Y);X += STRGAP; for(int i=0; DT[i]!=0;i++) if(DT[i]==TCHAR('0'))X=drawPulse(X,Y+10,10); else if(DT[i]==TCHAR('1'))X=drawPulse(X,Y-10,10); LineTo (hbuf,X, Y); DeleteObject(hpen); } void RZunipolarSignal(TCHAR DT[], TCHAR str[], int X, int Y){//単流RZ HPEN hpen = startPulse(str,X,Y);X += STRGAP; for(int i=0; DT[i];i++) if (DT[i]==TCHAR('0')) X = drawPulse(X,Y,10); else if(DT[i]==TCHAR('1')) X = drawPulse2(X,Y-10,Y,5); LineTo (hbuf,X, Y); DeleteObject(hpen); } void Manchester(TCHAR DT[], TCHAR str[], int X, int Y){//マンチェスタ符号 HPEN hpen = startPulse(str,X,Y);X += STRGAP; for(int i=0; DT[i];i++) if (DT[i]==TCHAR('0')) X=drawPulse2(X, Y-10, Y , 5); else if(DT[i]==TCHAR('1')) X=drawPulse2(X, Y , Y-10, 5); LineTo (hbuf,X, Y); DeleteObject(hpen); } void RZdipolarSignal(TCHAR DT[], TCHAR str[], int X, int Y){//複流RZ HPEN hpen = startPulse(str,X,Y);X += STRGAP; for(int i=0; DT[i];i++) if (DT[i]==TCHAR('0')) X=drawPulse2(X, Y + 10, Y, 5); else if(DT[i]==TCHAR('1')) X=drawPulse2(X, Y - 10, Y, 5); LineTo (hbuf,X, Y); DeleteObject(hpen); } void bipolarSystem(TCHAR DT[], TCHAR str[], int X, int Y){//バイポーラ(AMI) HPEN hpen = startPulse(str,X,Y);X += STRGAP; int IZ=-10; for(int i=0; DT[i]!=0;i++) if(DT[i]==TCHAR('0')) X = drawPulse(X,Y,10); else if(DT[i]==TCHAR('1')){ IZ*=-1; X = drawPulse(X,Y-IZ,10);} LineTo (hbuf,X, Y); DeleteObject(hpen); } void proc4B3T(TCHAR DT[], TCHAR str[], int X, int Y){//4B3T HPEN hpen = startPulse(str,X,Y);X += STRGAP; for(int i=0; DT[i]!=0;i++) if (DT[i]==TCHAR('0')) X = drawPulse(X,Y ,10); else if(DT[i]==TCHAR('+')) X = drawPulse(X,Y-10,10); else if(DT[i]==TCHAR('-')) X = drawPulse(X,Y+10,10); LineTo (hbuf,X,Y ); DeleteObject(hpen); } void procDraw(HWND hw){//描画 clearBitmap(); GetWindowText(edDT,frDT,500); GetWindowText(ed4B,fr4B,500); NRZunipolarSignal(frDT, TEXT("単流NRZ"),10, 100); RZunipolarSignal(frDT, TEXT("単流NRZ"),10, 130); NRZdipolarSignal(frDT, TEXT("複流NRZ"),10, 160); RZdipolarSignal(frDT, TEXT("複流RZ"),10, 190); bipolarSystem(frDT, TEXT("バイポーラ"),10, 220); Manchester(frDT, TEXT("マンチェスタ"),10, 250); mB1C(frDT, TEXT("8B1C"),10, 280); proc4B3T(fr4B, TEXT("4B/3T"),10, 330); InvalidateRect(hw,NULL,FALSE); } void procCreate(HWND hw, WPARAM wp,LPARAM lp){ int X0=20; createLabel(&label,hw,TEXT("信号") , X0, 5, 80,30, LB_1); createLabel(&label,hw,TEXT("4B/3T符号") , X0, 35,80,30, LB_2); int X=X0+75; createEdit(&edDT,hw, frDT, X0+75, 5, 400,25, ED_DT); createEdit(&ed4B,hw, fr4B, X0+75, 35, 400,25, ED_DT); createButton(&btGen ,hw,TEXT("4B/3Tへの変換" ), X0+500, 5,125,25, BT_GN); createButton(&btCode ,hw,TEXT("逆変換確認" ), X0+500, 35,125,25, BT_CD); SetWindowText(hw,TEXT("伝送路符号")); procGenCode(hw); MoveWindow(hw, 0,0,700,400,TRUE); initBitMap(hw);procDraw(hw); InvalidateRect(hw,NULL,FALSE); } void procCommand(HWND hw, WPARAM wp,LPARAM lp){ switch(LOWORD(wp)){ case BT_GN: procGenCode(hw);return; case BT_CD:procCheckCode(hw);return; } } LRESULT CALLBACK WndProc(HWND hw, UINT msg, WPARAM wp,LPARAM lp){ switch(msg){ case WM_DESTROY : PostQuitMessage(0) ;return 0; case WM_CREATE : procCreate (hw,wp,lp);return 0; case WM_COMMAND : procCommand(hw,wp,lp);return 0; case WM_PAINT : procPaint (hw, wp, lp) ; return 0; } return DefWindowProc(hw,msg,wp,lp); }