OCNS

نرم افزار شبیه ساز شبکه های CDMAی نوری چندکاربره

فصل 1 توضيح در مورد طرز کار با نرم افزار OCNS[1]

نرم افزار حاضر (Optical CDMA Network Simulator) يا به اختصار لاتين OCNS يک نرم افزار آموزشي و علمي-کاربردي مي باشد که با استفاده از نرم افزار Visual C++ 6.0 طراحي شده است. در اين فصل با نحوه کار با اين نرم افزار آشنا مي شويد. اين نرم افزار تنها بر روي تمام Platformهاي Windows قابل اجرا و راه اندازي مي باشد. نرم افزار به دو صورت Executable و Source Code بر روي CDي ضميمه پايان نامه موجود مي باشد و کاربران با مراجعه به آن و اجراي فايل OCNS.EXE و يا Compile کردن Source Code مي توانند برنامه را اجرا کنند. حداقل سيستم مورد نياز اين نرم افزار (Minimum System Requirements) به شرح زير است:

Pentium CPU (Higher than 1GHz Recommended)

16MB RAM (Higher than 128MB Recommended)

All Windows Platforms

30MB Hard Disk

نرم افزار فوق نياز به نصب شدن ندارد (No Installation Required) و ليسانس آن آزاد مي باشد (License Free) يعني استفاده از آن براي همگان آزاد مي باشد و هر گونه استفاده تجاري از آن غير قانوني مي باشد. استفاده از اين نرم افزار تنها در محدوده آموزشي (Educational) مي باشد و اميد است که در زمينه هاي علمي- کاربردي مفيد و موثر واقع شود. از آنجاييکه نرم افزار فوق الذکر يک نرم افزار شبيه سازي و ارزيابي براي سيستم شبکه CDMAي نوري مي باشد لذا هر قدر از Processorهاي با Clock Pulseي سريعتر استفاده شود سرعت شبيه سازي نيز سريعتر خواهد بود و اين نکته در هنگام استفاده از نرم افزار کاملا ملموس و مشهود است.

براي مثال در يک شماتيک شامل يک فرستنده، يک گيرنده و يک فضاي 1*1 از درجه اول با واحد زماني معادل 0.25ي يک Chip (در ادامه فصل با اين مفاهيم آشنا خواهيد شد) با استفاده از يک CPUي 2MHzي، شبيه سازي سيستم با حداکثر سرعت 5Bps معادل 40bps انجام خواهد شد که اين سرعت در عمل بسيار بيشتر است به اين دليل که نرم افزار فوق در واقع Taskي تمام اجزاي سيستم (شامل فرستنده ها، گيرنده ها، فضا و...) را به تنهايي انجام مي دهد در حالي که در يک سيستم شبکه CDMAي نوري هر جزئي با CPUي خود مستقلا در شبکه کار مي کند. برنامه به صورت MDI (Multiple Document Interface) مي باشد و تمام DLLهاي (Dynamic Link Library) لازم MFC (Microsoft Foundation Class Library) به آن ضميمه شده است لذا فايل OCNS.EXE به تنهايي بر روي Windows قابل اجراست. با اجراي برنامه با يکي از دو روش بالا (اجراي فايل OCNS.EXE و يا Compile کردن Source Code) پنجره اي به صورت زير بر روي صفحه ظاهر مي شود.

شکل 1: پنجره اصلي برنامه در محيط Windows

به صورت پيش فرض يک Document بر روي ِDesktopي برنامه وجود دارد که مي توان با Tabي File->New نيز Documentي جديدي به برنامه اضافه کرد. با افزودن Documentي جديد در Menu Barي نرم افزار گزينه هاي File، Edit، View، Simulation، Insert، Debug، Profile، Window و Help را مشاهده مي کنيد.

علاوه بر Menu Bar، براي سرعت بيشتر در کار Toolbarاي در زير Menu Bar مشاهده مي شود که به ترتيب از چپ به راست کارهاي New، Open، Save در Tabي File و Cut، Copy، Paste در Tabي Edit و Print در Tabي File و About و Help در Tabي Help را مستقيما انجام مي دهند.

در پايين هم Status Bar به صورت پيش فرض فعال است و وضعيت فعلي و يا برخي راهنماييها را به صورت Text در سمت چپ نمايش مي دهد و در سمت راست نيز وضعيت کليدهاي Num Lock، Caps Lock و Scroll Lock را نشان مي دهد. مي توان Toolbar و Status Bar را در Tabي View فعال و يا غير فعال کرد.

در ادامه به توضيح مختصري در رابطه با گزينه هاي Menu Bar مي پردازم.

شکل 2: نمايش Tabي فايل

فايل File:

در Tabي File مي توان يک Documentي را که قبلا ساخته شده است Open کرد و يا Documentي را که در حال حاضر ايجاد شده Save نمود. قابليتهاي Print و Sendي Document نيز به صورت Default بر روي MFC Appها وجود دارد.

ويرايش Edit:

اين Tab شامل قسمتهاي Undo (Ctrl+z)، Cut (Ctrl+x)، Copy (Ctrl+c) و Paste (Ctrl+v) مي باشد که در بيشتر نرم افزارها موجودند و کابران با قابليت و کارايي آنها آشنايند.

ديد View:

در اين گزينه مي توان Toolbar و Status Bar را فعال و يا غير فعال کرد.

شکل 3: نمايش Tabي Simulation

شبيه سازي Simulation:

اين Tab شامل قسمت هايي براي ايجاد Simulationي جديد (New) و ويرايش آن (Edit) و همچنين ذخيره کردن Simulationي فعلي (Save) و يا ذخيره آن بر روي فايلي جديد (Save as) و يا باز کردن يک Simulationي قبلا ذخيره شده (Open) مي باشد.

پنجره Window:

شکل 4: نمايش Tabي Window در Menu Bar

در اين قسمت مي توان بر روي Documentهاي باز شده تغييراتي ايجاد کرد و شکل قرار گرفتن پنجره آنها را تغيير داد. ترتيب قرار گرفتن پنجره Documentها به صورت Cascade و يا Tile مي تواند باشد. مي توان پنجره جديدي از همان پنجره فعلي (Current Window) نيز ايجاد کرد و يا پنجره ها را در کنار يکديگر مرتب کرد. همچنين مي توان ليست تمام Documentهاي باز شده را در پايين Tab مشاهده کرده و به دلخواه هر کدام را فعال نمود.

شکل 5: مربوط به شماره 1 باز کردن Documentي جديد

کمک Help:

اين گزينه شامل دو قسمت Help Topics و About OCNS مي باشد که اولي مربوط به Helpي نرم افزار مي باشد و دومي حاوي اطلاعاتي مربوط به خود پروژه مي باشد.

شکل 6: مربو ط به گزينه 2 انتخاب يک Simulationي جديد

- پياده سازي يک شبکه براي شبيه سازي

  1. در اولين گام يک Documentي جديد را چنانچه گفته شد باز مي کنيم.

  2. سپس از Tabي Simulation گزينه New را انتخاب مي کنيم.

شکل 7: مربوط به شماره 3 همين صفحه

  1. پس از تنظيم مقادير به صورت دلخواه (که در ادامه توضيح داده خواهد شد) Profileي مربوطه را OK مي کنيم.

· در اين لحظه بر اساس مقاديري که تنظيم کرده ايد شماتيکي از سيستم شبکه بر روي صفحه Document ظاهر مي شود که تمام فرستنده ها و گيرنده ها و Medium يا Objectي فضاي سيستم را نشان مي دهد.

4. در ادامه کار براي انجام عمل شبيه سازي مي توان در Tabي Debug گزينه RUN را انتخاب کرد. با اين کار پنجره اي باز مي شود که در آن مي توانيد مقاديري را براي

تنظيم اتفاقات حين شبيه سازي دست کاري کنيد. (که در ادامه توضيح داده خواهد شد)

5. براي ديدن دوباره Profileي فرستنده ها و يا گيرنده ها و يا Profileي محيط حائل سيستم مي توانيد به Tabي Profile مراجعه کنيد و يا در همان صفحه Document بر روي Objectها Click کنيد.

شکل 8: ديدن Profileي اجزاي سيستم از طريق Tabي Profile

شکل 9: ديدن Profileي اجزاي سيستم از طريق کليک Buttonاش

در اين قسمت به توضيح چگونگي تنظيم مقادير برخي از ديالوگها مي پردازم.

ديالوگ Simulation Profile:

نمونه يک ديالوگ Simulation Profile را که فيلدهاي مختلف آن شماره گذاري شده است، در زير مشاهده مي کنيد.

شکل 10: نمونه يک Simulation Profile Dialogي شماره گذاري شده

همانطور که در شکل ديده مي شود اين ديالوگ شامل 34 قسمت مي باشد. اين ديالوگ مانند بسياري از ديالوگها شامل Static Text، Edit Box، Button و يک List Box مي باشد. شماره ها نشان دهنده Tab Orderي Controlها (منظور همين Static Text، Edit Box، Button و List Boxها مي باشد) است.

با باز شدن ديالوگ از Tabي Simulation->New در Menu Bar، به صورت پيش فرض Cursor بر روي Itemي شماره 3 چشمک مي زند و با زدن کليد Tab بر روي Edit Boxها و Buttonها به ترتيب مي رود. در ابتداي کار برخي از Buttonها غير فعال هستند ولي در ادامه با توليد کردن کدهاي متعامد نوري فعال مي شوند. (که در ادامه کار به توضيح آن مي پردازم)

در Edit Boxي شماره 3 تعداد فرستنده هاي سيستم را وارد کنيد. سپس در Edit Boxي شماره 6 تعداد گيرنده ها را وارد کنيد. آنگاه در Group Boxي Code Generation مقادير طول کد OOC (Optical Orthogonal Code) و وزن آن و پارامترهاي تصادم (Collision) را به ترتيب در Edit Boxهاي شماره 12، 14، 17 و 19 وارد کنيد. سپس دکمه شماره 20 (Generate Codes) را کليک کنيد تا کدهاي OOC بر اساس پارامترهاي دلخواهتان توليد شوند.

کدهاي ساخته شده در List Boxي شماره 25 نمايش داده مي شوند و همزمان با آن Buttonهاي شماره 21، 22 و 23 فعال مي شوند و همچنين Edit Boxهاي شماره 3 و 6 غير فعال مي شوند و اگر چنانچه تعداد فرستنده ها و يا گيرنده ها را بيشتر از تعداد کدها وارد کرده باشيد مقادير اين Edit Boxها برابر با مقدار حداکثر که همان تعداد کدهاست، مي شود.

در Edit Boxي شماره 9 مي توانيد مقدار کاليبراسيون سيستم را بر اساس سطح سيگنال موجود در ورودي گيرنده ها که در تنظيمات Medium مفصلا توضيح داده مي شود، تعيين و وارد کنيد. (اين قسمت کاملا بستگي به درک و شناخت شما از يک شبکه نوري با مدلسازي Medium آن با فيلترهاي FIR دارد که تخصصي مي باشد و وارد کردن مقادير نا معقول باعث نتايج غير منطقي در شبيه سازي سيستم مي شود)

در Edit Boxي شماره 27 مي توانيد شروع عمل شبيه سازي را بر واحد Byte وارد کنيد. اگر مقدار آن را بر روي پيش فرض صفر نگه داريد شبيه سازي از ابتداي شروع به کار فرستنده ها و گيرنده ها آغاز مي شود و اگر مقدار ديگري قرار دهيد شبيه سازي سيستم پس از گذشت آن تعداد Byte از شروع به کار اولين فرستنده آغاز مي شود.

چنانچه در Edit Boxي شماره 29 مقدار Defaultي صفر را نگه داريد شبيه سازي سيستم تا بينهايت ادامه خواهد داشت و چنانچه مقدار ديگري را لحاظ کنيد، شبيه سازي تا انتهاي Byteي مذکور ادامه مي يابد و سپس قطع مي شود.

در Edit Boxي شماره 32 نيز مي توانيد مقدار SubChipPerChipي سيستم يا همان کوچکترين واحد زماني سيستم که از کنار هم قرار گرفتن اين تعداد از آن يک Chipي سيستم شکل مي گيرد را وارد کنيد. توجه کنيد که مقدار SubChipPerChip با سرعت شبيه سازي سيستم در رابطه عکس است و هر آنقدر که مقدار آن را افزايش دهيد مقدار سرعت عمل شبيه سازي نرم افزار در عکس آن ضرب مي شود. لذا در انتخاب آن دقت فرماييد!

در ادامه کار مي توانيد Buttonهاي شماره 21، 22 و 23 را به ترتيب براي پرکردن ديالوگهاي فرستنده(ها)، گيرنده(ها) و Medium کليک کنيد و در نهايت دکمه شماره 33 را به عنوان تاييد مقادير تنظيم شده در Profileي سيستم بفشاريد! نمونه يک Simulation Profileي تکميل شده بدون شماره گذاري را مي توانيد در ادامه مشاهده نماييد.

شکل 11: نمونه يک Simulation Profile Dialogي پرشده

ديالوگ Transmitter Profile:

بعد از وارد کردن پارامترهاي Group Boxي Code Generation در Simulation Profile و توليد کردن کدهاي CDMAي نوري، Buttonهاي مربوط به Initializationي فرستنده ها و گيرنده ها و Medium فعال مي شوند. حال با فشردن دکمه Initialize Transmitter(s) پنجره اي مشابه پنجره اي که در ادامه مي بينيد باز مي شود که براي سهولت دادن توضيحات قسمتهاي مختلف آن شماره گذاري شده است.

شکل 12: نمونه يک Transmitter Profile Dialogي شماره گذاري شده

نرم افزار در Edit Box ي شماره ي3 که به صورت read-only مي باشد مقدار شناسه مربوطه به فرستنده جاري را مشخص مي کند. براي سادگي شماره شناسه ها از صفر به صورت صعودي بر اساس تعداد فرستنده ها توسط نرم افزار تنظيم مي شود و تا آخر نيز همين شناسه ها براي فرستنده ها در تمام مراحل باقي مي ماند. درEdit Boxي شماره 5 مي توانيد مقدار اندازه بافر فرستنده را تغيير دهيد و بر حسب اينکه مي خواهيد که چه اندازه اطلاعات را با آن فرستنده انتقال دهيد آن را تنظيم کنيد. در Edit Boxي شماره ي 7 نيز مي توانيد اندازه پنجره ي بافر فرستنده (Window Size) را که در انتقالات Go Back N و Selective Repeat در لايه Data Link استفاده مي شود تنظيم کنيد

توجه کنيد که Window Size در نسخه فعلي نرم افزار مورد استفاده قرار نمي گيرد و براي استفاده در نسخه هاي آتي قرار داده شده است. درBoxي شماره 9 مي توانيد مقدار تاخير عملياتي فرستنده را که معمولا بين دو فريم متوالي در نظر گرفته مي شود را تنظيم کنيد و يا با انتخاب Radio Buttonي "on" در قسمت Randomize (شماره 15) مقدار آن را به صورت Random واگذاريد. با فشردن دکمه شماره 10 (Load File)، 11 (Load Binary File) و 12 (Load Data) مي توانيد بافر فرستنده را از اطلاعات مورد نظر خود به ترتيب از يک فايل به صورت کاراکتر به کاراکتر، از يک فايل به صورت باينري صفر و يک و يا مستقيما با وارد کردن کاراکتر و يا صفر و يک در ديالوگ Data Definition پر کنيد. در Box ي شماره ي 17 مقدار فضايي از بافر فرستنده که توسط اطلاعات مورد نظر اشغال شده به نمايش در مي آيد، و با زدن دکمه Show Buffer (شماره ي 37) مي توانيد محتواي بافر فرستنده را نيز مشاهده کنيد. در قسمت Group Box ي Transmission Configuration پارامترهاي مربوطه به frameبندي اطلاعات ذخيره شده در بافر از شما خواسته شده است، که در فيلدهاي شماره ي 22، 24 و 26 مي توانيد به ترتيب مقادير اندازه Header، اندازه Pay-Load واندازه CRCي Frameي توليدي توسط فرستنده را مشخص کنيد.

ü توجه کنيد که فيلد شماره 20 که به صورت read-only مي با شد، با توجه به فيلدهاي قبلش (22، 24 و26) برابر با مقادير مجموع آنها اتوماتيک ست مي شود. در Combo Boxي شماره ي 28 مي توانيد روي OOCهاي قبلا توليد شده توسط کلاس CSim عمل Scroll را انجام دهيد و در صورتي که کد انتخابي شما قبلا توسط فرستنده اي انتخاب نشده باشد مي توانيد کد قبلي را با کد جديد جايگزين کنيد در نتيجه مقدار Edit boxي شماره 29 نيز به نشانه شماره و index کد انتخابي جديد تغيير مي کند.

ü توجه کنيد که نرم افزار به صورت هوشمند براي هر فرستنده به صورت پيش فرض OOC اي را که قبلا انتخاب نشده انتخاب مي کند و کاربر مي تواند آن را تنها در صورت پيدا کردن کدي که به فرستنده اي تعلق ندارد، تغيير دهد. در فيلد شماره ي 33 مي توانيد زمان شروع ارسال فرسنتده را تنظيم کنيد و در صورت تمايل مي توانيد با انتخاب Radio-Buttonي شماره ي 36 آن را به صورت Randomize در آوريد تا زمان ارسال آن به صورت Random و تصادفي آغاز شود.

ü توجه کنيد که به صورت پيش فرض مقادير فرستنده به صورت غير تصادفي و ثابت تنظيم شده است و کاربر به سليقه خود مي تواند آنها را تغيير دهد. در ادامه نمونه يک Transmitter Profile ي پر شده بدون شماره گذاري را مشاهده مي کنيد که بافر آن از يک فايل 1527 بايتي پر شده است و زمان تاخير عملياتي و شروع ارسال آن تصادفي در نظر گرفته شده است.

در پايان هنگامي که تمامي مقادير را تنظيم کرديد و بافر فرستنده را از اطلاعات دلخواه براي ارسال پرنموديد، مي توانيد فرستنده را براي ارسال آماده کنيد و دکمه شماره 30 را کليک کنيد و يا با کليک دکمه ي شماره ي 31 آن را به حالت خاموش تا اطلاع ثانوي نگه داريد.

شکل 13: نمونه يک Transmitter Profile Dialogي پرشده

ديالوگ Receiver Profile:

مانند آنچه در مورد ديالوگ فرستنده گفته شد در مورد گيرنده ها نيز پس پايان عمل توليد OOCها، مي توان دکمه Initialize Receiver(s) را براي تنظيم مقادير و پارامترهاي گيرنده فشرد. براي سهولت و خوانايي بيشتر، فيلدهاي کنترلي ديالوگ گيرنده در ادامه آمده است و مي توانيد همراه با خواندن متن به آن مراجعه کنيد.

شکل 14: نمونه يک Receiver Profile Dialogي شماره گذاري شده

در Edit Boxي شماره ي 3 که به صورت read-only مي باشد شناسه گيرنده مشخص مي شود که به صورت يک عدد از صفر تا مقدار ماکزيممم آن که برابر يک واحد کمتر از تعداد گيرنده ها است، مي باشد. در قسمت Group boxي Receiver Configuration مانند مشابه آن در فرستنده، Edit Boxهاي شماره 5،7 و 9 به ترتيب به مقادير اندازه بافر، اندازه پنجره و مقدار تاخير عملياتي مربوط مي باشند و همان توضيحات بخش قبل که مربوط به فرستنده بود، در اينجا نيز صادق است، با اين تفاوت که تاخير عملياتي (Process Delay) در مورد گيرنده ها در حال حاضر مصداق عملي ندارد و پيش بيني مي شود که در آينده بتوان براي آن مصداقي پيدا کرد. چون در واقع گيرنده ها همواره در حال پروسس (Listening) مي باشند. در ضمن Process Delay را همانند فرستنده ها در اينجا نيز مي توان به صورت تصادفي و يا ثابت با تغيير Radio- Buttonهاي شماره ي 12 و 13 تنظيم کرد. در ابتداي کار، قبل از عمل شبيه سازي و يا همان به کار افتادن سيستم شبکه Optical CDMA، بافر گيرنده ها خالي از اطلاعات است لذا Edit Boxي شماره ي 15 عدد صفر را نشان مي دهد و با فشردن دکمه ي Show Button (شماره 38) بافر خالي را مشاهده مي کنيد. ولي بعد از انجام عمل شبيه سازي مي توانيد براي مشاهده بافر پرشده گيرنده ها به Tabي Profileي Menu Bar مراجعه کنيد و يا مستقيما Objectي گيرنده ها را از صفحه Document کليک کنيد و در نهايت دکمه ي Show Buffer را کليک کنيد. براي ذخيره ي بافر پرشده گيرنده (بعد از اتمام عمل شبيه سازي) مي توانيد دکمه ي Save Data را کليک کنيد و محتواي بافر را در يک فايل اي که خود نام آن را تعيين مي کنيد ذخيره نماييد. در قسمت Reception Configuration (Boxهاي شماره 20، 22 و 24) مي توانيد پارامترهاي مربوط به frameبندي سيستم را تنظيم کنيد. (Box شماره 18 فقط خواندني است مانند قسمت فرستنده)

ü توجه کنيد که پارامترهاي frame بندي گيرنده را مشابه همان پارامترهاي frame بندي فرستنده تعيين کنيد چون در غير اين صورت اطلاعات فرستنده مورد نظر به درستي در گيرنده هم OOC آن دريافت نمي شود. لذا در تنظيم مشابه پارامترهاي دريافت با تنظيمات ارسال دقت فرماييد.

با کليک Buttonي شماره 39 (Setup Header Format) در حال حاضر اتفاقي نمي افتد ولي در آينده مي توان از آن به عنوان يک الگوريتم frameبندي سيستم دريافت در گيرنده استفاده کرد و براي ياد آوري، تنها دکمه آن به نمايش در آمده است. در Combo Box ي شماره 26 مي توانيد OOC مورد نظر خود را انتخاب کنيد. نرم افزار به صورت هوشمند براي شما از قبل يک OOC در نظر مي گيرد ولي شما مي توانيد به دلخواه آن را به OOC ديگري که قبلا توسط گيرنده هاي قبلي انتخاب نشده باشد تغيير دهيد. به محض انتخاب OOCي مورد نظر، در Edit Box ي شماره 27 که فقط خواندني مي باشد شماره OOC انتخاب شده را مشاهده مي کنيد.

در قسمت Group Boxي Limiter Type مي توانيد براي سيستم گيرنده خود يکي از سه نوع بدون محدود کننده، محدود کننده سخت و محدود کننده نرم، تنها به عنوان نامي تصنعي که در آينده بتوان تدابيري براي آن لحاظ کرد، را انتخاب کنيد. آخرين Group Box (شماره 32) مربوط به استفاده از يکي از دو روش معمول در سنکرون سازي گيرنده با فرستنده هم OOCاش مي باشد که کاربر مي تواند با انتخاب يکي از Radio- Button هاي شماره 33 ويا 34 به ترتيب روش Simple Serial Search ويا Matched Filter را براي Acquisitionي سيستم دريافت در گيرنده مورد استفاده قرار دهد. در انتها با کليک دکمه شماره 28 مي توانيد گيرنده را در حال آماده براي دريافت (Full Listening) و يا با کليک دکمه شماره 29 در حالت خاموش قرار دهيد. نمونه يک فرم پر شده از Receiver Profile را مي توانيد در ادامه مشاهده کنيد.

شکل 15: نمونه يک Transmitter Profile Dialogي پرشده

ديالوگ Data Definition:

همانطور که در پيش توضيح داده شد، اين ديالوگ در دل ديالوگ Transmitter Profile نهفته است و هنگامي که کاربر بخواهد اطلاعات را مستقيما وارد بافر فرستنده کند مي تواند با کليک دکمه Load Data در صفحه Transmitter Profile ديالوگ Data Definition را به صورتي که در زير آمده است باز کند و اطلاعات مورد نظر را بر حسب کاراکتر ويا باينري وارد کند.

شکل 16: نمونه يک Data Definition Dialogي شماره گذاري شده

در قسمت Data Type شما مي توانيد نوع Dataي ورودي را تعيين کنيد. که به دو صورت باينري (يعني در قسمت Edit Box صفر و يک وارد مي کنيد و نرم افزار داده هاي ورودي شما را به صورت بيت در نظر مي گيرد) شماره 3 و کاراکتر (يعني در قسمت Edit Box هر چه وارد کنيد به صورت کاراکتر در نظر گرفته مي شود و معادل يک کد 8 بيتي اسکي است) شماره 4 مي باشد.

حال در قسمت Edit Boxي شماره يک مي توانيد داده مورد نظر خود را که نوع آن را قبلا تعيين کرده ايد وارد نماييد. با زدن دکمه OK تنظيمات تاييد و بافر فرستنده از اطلاعات وارد شده پر مي شود.

نمونه يک ديالوگ Data Definitionي پر شده را در روبرو مي توانيد مشاهده نماييد. داده از نوع کاراکتر مي باشد و در قسمت Edit Box جمله اي شامل کاراکترهاي اسکي استاندارد تايپ شده است.

ديالوگ Show Buffer:

اين ديالوگ در دل ديالوگهاي Transmitter Profile و Receiver Profile موجود مي باشد و براي ديدن محتواي بافر فرستنده ها و گيرنده ها به صورت کاراکترهاي اسکي (char) به کار مي رود. محتواي بافر در Edit Boxي شماره يک به صورتي که در

شکل روبرو مي بينيد به نمايش در مي آيد.

ديالوگ Enter Your Number:

اين ديالوگ در بطن ديالوگ FIR Profile مي باشد و براي وارد

کردن و يا اصلاح مقادير ضرايب فيلتر FIRي که ديالوگ آن به

شکل 19: نمونه ديلوگ Enter your Numberي پرشده

صورت يک FIR Profile باز شده است به کار مي رود.

مقدار ضريب را مي توانيد در قسمت Edit Boxي شماره يک به صورت اعشاري (double) از نوع کاراکتر وارد کنيد و نرم افزار به صورت هوشمند آن را به صورت اعشاري (double) به ضرايب فيلتر FIR شما اضافه مي کند. نمونه يک عدد اعشاري وارد شده را در شکل روبرو مشاهده مي کنيد.

مقدار ضريب مي تواند به صورتهاي زير هم وارد شود.

1001, 10.01, .003, 0.0005, or 1.03e-4

ديالوگ Medium Profile:

بعد از به وجود آمدن OOCها در ديالوگ Simulation Profile مي توان دکمه Initialize Medium را براي تعريف Mediumي پروژه کليک کرد و در اين صورت ديالوگي مانند ديالوگ زير باز مي شود.

شکل 20: نمونه يک ديالوگ Medium Profileي شماره گذاري شده

در Edit Boxي شماره 2 و 4 به ترتيب تعداد فرستنده ها و تعداد گيرنده ها به صورت فقط خواندني به نمايش در مي آيد. در Flex Gridي شماره 8 يک ماتريس NumTx * NumRx با درايه هايي به شکل H[i,j] به نمايش در مي آيد. کاربر مي تواند با دو بار کليک کردن درايه هاي ماتريس، فيلتر FIRي مربوط به هر کدام را به دلخواه اصلاح نمايد. با باز شدن FIR Profileي فيلتر FIR درايه متناظر آن به صورت H[i,j] پررنگ در مي آيد. براي Reset کردن تمام فيلترهاي ماتريس مي توان دکمه New (Reset)ي شماره 5 را فشرد و دوباره از نوع فيلترهاي درايه ها را اصلاح کرد. بعد از اصلاح تمام درايه ها (تنظيم ضرايب فيلترهاي FIR) مي توان با کليک دکمه شماره 7 (Export H[i,j]) ماتريس فيلترها را در فايلي که خود نام آن را انتخاب مي کنيد ذخيره نماييد. همچنين مي توان با کليک دکمه شماره 6 (Import H[i,j]) يک ماتريس از فيلترهاي FIR هم بعد با ماتريس اخير را از طريق فايل مربوطه اش که قبلا از طريق Export ذخيره شده است Import کرده و ديگر نيازي به تنظيم تک تک درايه ها نيست! بعد از انجام تنظيمات دکمه OK را کليک کنيد. نمونه هاي ساده ماتريس 1*1 و 2*2 با فيلترهاي درجه يک FIR با اندازه يک را مي توانيد در Folderي Samplesي در مسير اصلي source codeي پروژه بر روي CD بيابيد. نمونه اي از يک Medium Profileي که يکي از ضرايب فيلتر FIRي درايه H[1,0] آن در حال تصحيح است را در ادامه مشاهده مي کنيد.

شکل 21: شماي کلي از طريقه پرکردن يک ديالوگ Medium Profile

ديالوگ FIR Profile:

همانطور که گفته شد در Medium Profile با کليک کردن هر کدام از درايه هاي ماتريس فيلترهاي FIR يک FIR Profileي مربوط به همان درايه يا فيلتر به صورتي که در ادامه مي بينيد باز مي شود.

شکل 22: نمونه يک FIR Profileي شماره گذاري شده

شکل 23: نمونه يک FIR Profileي پرشده

برحسب آنکه کاربر چه مقداري را به عنوان درجه فيلتر در Edit Boxي شماره 1 وارد کند، به همان تعداد (=درجه فيلتر) در Flex Gridي شماره 3، مستطيل سفيد که در ابتدا حاوي عدد صفرند، به وجود خواهد آمد که با کليک هر کدام از اين مستطيلهاي سفيد مي توان با استفاده از ديالوگ Enter Your Number مقدار عددي داخل آنها را تغيير داد.

بعد از اصلاح ضرايب فيلتر FIR دکمه OK را به نشانه تاييد کليک کنيد. براي نمونه مي توانيد يک FIR Profileي پر شده را در شکل روبرو مشاهده کنيد. فيلتر از درجه 13 است و مقادير ضرايب به صورت کاملا دلخواه پر شده است.

ديالوگ SimShow (Simulation Show):

اين ديالوگ از طريق Tabي Debug با انتخاب گزينه RUN باز مي شود. توجه کنيد که براي باز کردن اين ديالوگ که مربوط به اجراي عمل شبيه سازي و مشاهده برخي از رويدادها در حين اين عمل مي باشد، بايستي تمام قسمتهاي Simulation Profile را که مربوط به کدهاي عمود نوري و فرستنده ها و گيرنده ها و فضا (Medium) مي شود را به طور صحيح چنانچه گفته شد پر کرده باشيد وگرنه صفحه اين ديالوگ به نشانه ناقص بودن پروژه باز نخواهد شد.

نمونه شماره گذاري شده ديالوگ SimShow را مي توانيد در ادامه ببينيد. براي سهولت توضيح قسمتهاي مختلف آن از اين شماره ها به همراه اسمها استفاده شده است.

شکل 24: نمونه يک ديالوگ SimShowي شماره گذاري شده

در Group Boxي شماره 1 مي توانيد حالت فعلي سيستم را در هر لحظه از عمل شبيه سازي مشاهده کنيد، به اين معني که حالت سيستم در Edit Boxهاي شماره 4، 6، 8 و10 بر حسب آنکه پالس کلاک سيستم به ترتيب در چه بايت، بيت، چيپ[2] و ساب-چيپ[3] است به نمايش در مي آيد. همچنين در همين Group Box (State of System) مي توانيد حالت فعلي يک فرستنده دلخواه و حالت فعلي يک گيرنده دلخواه را نيز مشاهده کنيد. به اين صورت که ابتدا در فيلد شماره 13 شناسه فرستنده مورد نظر خود و در فيلد شماره 20 شناسه گيرنده مورد نظر خود را وارد کنيد و سپس با فعال کردن فيلدهاي شماره 17 و 24 با انتخاب Radio-Buttonهاي شماره 15 و 22 حالت فعلي فرستنده و گيرنده مورد نظر خود را در Edit Boxهاي شماره 17 و 24 مشاهده نماييد.

در Group Boxي شماره 25 مي توانيد سرعت عمل شبيه سازي سيستم را تنظيم کنيد. به اين صورت که با تغيير Sliderها (که شبيه به Volume-bar هستند) مي توانيد سرعت را تغيير دهيد. به صورت پيش فرض سرعت سيستم روي مينيمم مقدار تنظيم شده است. با تغيير Sliderي شماره 27 مي توانيد سرعت اصلي عمل شبيه سازي سيستم را با تغيير زمان Interruptي Timerي سيستم عوض کنيد. به صورت Default مقدار اين زمان Interrupt برابر 100ms مي باشد و با کشيدن آن به سمت چپ مي توانيد آن را تا 1ms کاهش دهيد.

Sliderهاي شماره 29 و 30 به صورت حاصلضربي کار مي کنند، به اين معنا که به اندازه حاصلضرب مقدار عددي اين دو Slider، هر بار که Timerي سيستم Interrupt مي دهد، روال Clock()ي فرستنده ها و گيرنده ها اجراء مي شود و اين عمل به افزايش سرعت شبيه سازي سيستم کمک مي کند. (مقدار عددي Sliderها عددي مابين 1 تا 100 مي باشد که به صورت صعودي از چپ به راست است.) در قسمت Group Boxي شماره 31 مي توانيد رويدادهايي چون Acquisition و Trackingي گيرنده ها را در حين عمل شبيه سازي سيستم مشاهده کنيد. در اين قسمت Event Viewer چند فيلد به صورت Combo Box (به شماره هاي 32، 33، 34، 35 و 36) موجود مي باشد که در حال حاضر خالي مي باشد ولي مي توان در آينده براي گسترش نمايش رويدادهاي مهم حين عمل شبيه سازي آنها را به صورت فيلدهاي تصميم گيري در نظر گرفت. با انتخاب Radio-Buttonي شماره 38 مي توان List Boxي شماره 39 را براي نمايش رويدادها فعال نمود. توجه کنيد که تمام Radio-Buttonها به صورت پيش فرض off مي باشند.

دکمه شماره 40 (Resume/Pause Button) براي شروع و يا توقف عمل شبيه سازي در هر مرحله از عمل شبيه سازي سيستم به کار مي رود و با کليک بر روي آن، برچسب آن از Resume به Pause و يا از Pause به Resume تغيير مي يابد. دکمه شماره 41 (Reset Time) نيز براي Resetکردن عمل شبيه سازي از ابتداي کار به کار مي رود. دکمه شماره 42 (Reset Transmitters) در حال حاضر کاري انجام نمي دهد ولي مي توان در اينده از آن به عنوان Restart کردن فرستنده ها براي بازارسال بافرشان و يا... استفاده کرد. دکمه هاي شماره 43 و 44 (STOP! و Cancel) به ترتيب براي پايان دادن عمل شبيه سازي و کنسل کردن و بستن ديالوگ SimShow به کار مي روند. در ادامه مي توانيد نمونه اي از يک شبيه سازي در حال اجرا در صفحه ديالوگ SimShow را مشاهده کنيد.

شکل 25: نمونه يک ديالوگ SimShowي در حين عمل شبيه سازي

فصل 2 معرفي و توضيح اجمالي کلاسهاي تعريف شده در پروژه

کلاس CAboutDlg

اين کلاس در حقيقت به صورت زير کلاسي در کلاس COCNSApp تعريف شده است و جزء کلاسهاي پيش فرض MFC (Microsoft Foundation Class) مي باشد که به صورت Default به هنگام تعريف خصوصيات پروژه ساخته مي شود.

کلاس اخير با ديالوگ About OCNS که شناسه آن IDD_ABOUTBOX مي باشد کار مي کند و تنها براي نمايش آيکون و شماره نسخه و زمان ساخت پروژه به اضافه اطلاعاتي در رابطه با نويسنده و طراح آن به کار مي آيد که کاربران مي توانند با انتخاب گزينه About OCNS در Tabي Helpي Menu Barي نرم افزار به ديالوگ آن دسترسي يافته و اطلاعات ياد شده را در آن مشاهده کنند.

کلاس CBit

اين کلاس براي تعريف Objectي Bit در اين پروژه به کار مي رود. از آنجا که هر بيت در سيستم شبکه CDMA نوري تلفيقي از چند چيپ مي باشد و هر چيپ نيز تلفيقي از چند ساب-چيپ مي باشد لذا براي خصوصيات اين کلاس از آرايه اي از Chipها استفاده شده است که اجزاي داخلي يک بيت را تشکيل مي دهند. اين کلاس در کلاس CRx به عنوان بيت دريافتي يک گيرنده تعريف مي شود و اجزاي داخلي آن (Chipها و Sub-Chipها) مرحله به مرحله طي عمل شبيه سازي در روال Clock() گيرنده شناسايي و تعيين مي شوند و در نهايت پس از دريافت يک بيت کامل objectي CBit* bit تحت بررسي و آناليز گيرنده قرار مي گيرد. لذا اين object (CBit) مهمترين عضو سازنده در اطلاعات خروجي فرستنده ها و ورودي گيرنده ها مي باشد. سازنده (Constructor)ي اين object دو مقدار ChipSize و SubChipSize را مي گيرد تا براي ساختن آرايه Chipها که هر Chip نيز آرايه اي از SubChip هاست حافظه مناسب را تخصيص دهد. از آن طرف نيز پاک کننده (Destructor)ي کلاس تمام اين حافظه تخصيص داده شده را از RAM پاک (Delete) مي کند تا وقتي objectي بيت پاک شد تمام متغيرهاي مربوط به آن (Chipها و SubChipها) نيز پاک گردند.

متغيرهاي تعريف شده در اين کلاس، همانطور که گفته شد، شامل آرايه اي از Chipها (که به صورت اشاره گر CChip* تعريف شده است و به محض ساخت بيت بايد اندازه آرايه نيز به همراه آن تعريف شود تا به اندازه آن حافظه به آرايه تخصيص داده شود)، اندازه آرايه که همان تعداد Chipهاي استفاده شونده به ازاي هر بيت است و مقدار بيت (که مي تواند بيت يک يا صفر باشد) ميباشد. توابع و روالهاي اين کلاس شامل ChipRotate، SubChipRotate و WriteChip مي باشند و همانطور که از نامشان پيداست به ترتيب وظايف زير را به عهده دارند.

ChipRotate(int shift) آرايه Chipها را به اندازه مقدار عددي shift به سمت راست مي چرخاند يعني شيفت چرخشي مي دهد به گونه اي که Chipي اول و آخر را پشت سر هم در نظر مي گيرد.

SubChipRotate(int shift) آرايه Chipها را با توجه به SubChipهاي داخل هرکدام به اندازه shift به سمت راست مي چرخاند يعني به صورت چرخشي شيفت مي دهد.

تابع WriteChip(int index, int shift) براي نوشتن chipاي در فاصله ذکر شده (shift) از chip مورد نظر در شماره index است. اين تابع به صورت بازگشتي جالبي عمل مي کند و در نهايت با تمام Chipها اين کار را انجام مي دهد و بدينسان تمام Chipها به اندازه shift مي چرخند. اين روال به صورت يک روال کمکي در تابع ChipRotate() استفاده مي شود و در نهايت براي تکميل عمليات در تابع ChipRotate() آخرين Chipي آرايه در اولين Chipي آرايه ريخته مي شود.

کلاس CBuffer

اين کلاس در حال حاضر مورد استفاده اين پروژه قرار نگرفته است ولي در آينده مي توان از آن به عنوان کلاسي که تمام مشخصات بافر فرستنده ها و گيرنده ها را در بر دارد استفاده کرد. در حال حاضر بافر و ديگر اجزاي آن در کلاس CTx و CRx به طور کامل تعريف شده است. ولي با تعريف اين کلاس مي توان براي فرستنده ها و گيرنده ها به طور نامحدود بافر تعريف کرد. همچنين فرستنده ها را براي ارسال آنها و گيرنده ها را براي دريافت آنها برنامه ريزي کرد.

به عنوان خصوصياتي از اين کلاس مي توان به تعريف متغيري از نوع char به صورت آرايه اي و متغيري از نوع int به عنوان اندازه و طول آن اشاره کرد. همچنين مي توان ديلوگي مانند CDataDialog ترتيب داد که کاربر از طريق آن بتواند اين اطلاعات را وارد کند. همچنين براي شناسايي بافرها بايد متغير يا متغيرهايي تعريف کرد که نشان دهند هر بافر به کدام فرستنده يا گيرنده تعلق دارد و چندمين بافر ساخته شده در پروژه مي باشد.

کلاس CChildFrame

از کلاسهاي پيش تعريف MFC مي باشد که به هنگام باز کردن پروژه به صورت اتوماتيک در Work Spaceي پروژه ايجاد مي شود. اين کلاس مربوط به پروژه هاي از نوع MDI (Multiple Document Interface) مي باشد و Handleي بچه فريم هاي موجود در صفحه Documentي اصلي را بدست مي گيرد و باز و بسته شدن آنها را با اعمال برخي تنظيمات کنترل مي کند.

کلاس CChip

براي تعريف objectي Chip از اين کلاس استفاده مي شود. چيپ واحد ساختماني بيت در شبکه CDMAي نوري مي باشد بطوريکه ارسال يا دريافت رشته اي از چيپها به اندازه طول يک OOC معادل ارسال يا دريافت يک بيت است. همچنين واحد ساختماني هر چيپ يک ساب-چيپ است. لذا آرايه اي از Sub-Chipها از نوع بايت[4] به عنوان متغيري از اين کلاس تعريف شده است. همچنين خصوصياتي چون طول آرايه که برابر SubChipPerChip معمولا قرار داده مي شود و مقدار[5] اين object که مي تواند صفر و يا يک و يک به بالا از نوع صحيح[6] باشد، به متغيرها اضافه شده است.

از اين object در کلاس CBit به عنوان واحد سازنده بيت استفاده مي شود. هنگامي که يک objectي بيت تعريف مي شود براي تک تک چيپهاي آن سازنده (constructor)ي CChip فراخواني مي شود و براي آرايه Sub-Chipها حافظه مورد نياز تخصيص داده مي شود. براي Sub-Chipها ديگر نيازي به تعريف کلاس نبوده است زيرا آنها به عنوان کوچکترين واحد زماني سيستم و واحد ساختماني چيپها در اين کلاس از نوع BYTE تعريف شدند و از 0 تا 255 مي توانند مقدار بپذيرند. از آن جهت که سيگنالهاي نوري هيچگاه منفي نمي شوند و وقتي با هم تداخل مي کنند با هم به نوعي جمع مي شوند[7] لذا در نظر گرفتن يک پالس نوري در کوچکترين واحد زماني از نوع BYTE بسيار مناسب است.

کلاس CCode

تمام خصوصيات کدهاي متعامد نوري[8] در اين کلاس تعريف شده است. براي اين کلاس خصوصيات زير به صورت متغير در نظر گرفته شده است که برخي از آنها ذاتي اند و برخي ديگر بالقوه که بعد از توليد[9] اين کدها تنظيم و يا اصلاح مي شوند. شناسه يا همان IDي کد OOC که نمايانگر شماره indexي کد در ميان همه کدهاي توليد شده در پروژه مي باشد. دو متغير tx و rx که از نوع Boolean هستند و نشان مي دهند که کد حاضر به فرستنده يا گيرنده اي تخصيص داده شده است يا خير. متغير str که از نوع آرايه اي از کاراکترهاي صفر و يک ميباشد و OOCي اخير را به صورت رشته اي در بر دارد. اين مشخصات به نوعي مشخصات بالقوه اين کلاسند که پس از توليد کدها و اختصاص آنها به فرستنده ها و گيرنده ها تنظيم مي شوند.

خصوصيات ذاتي کدها که در توليد آنها هم مورد استفاده قرار مي گيرد عبارتند از:

متغير F که نشاندهنده طول کد بر حسب تعداد چيپ به کار رفته در آن است.

متغير w که نشاندهنده وزن کد بر حسب چيپ است يعني تعداد يک-چيپهاي[10] موجود در کد.

متغير ccc که نشاندهنده همان قيد تشابه ضربدري يا دوناهمجنس[11] هر دو کد با هم مي باشد.

متغير acc که نشاندهنده همان قيد خودمتشابهي هر کدي با خودش مي باشد و

متغير k که ماکزيمم پارامتر تداخل يا تصادم را نشان مي دهد و برابر همان دو متغير acc و ccc مي باشد وقتي که آندو با هم برابرند.

کلاس CCounter

براي ارسال و يا دريافت اطلاعات، فرستنده ها و گيرنده ها از شمارنده ها استفاده مي کنند و چون اطلاعات در هر پالس کلاک به صورت يک Sub-Chip که کوچکترين واحد زماني سيستم است مي باشد، ارسال و دريافت مي شوند. ولي ذخيره کردن Sub-Chipها بر روي حافظه کاري بس عبث و بيهوده است چون به ازاي هر Sub-Chip حداقل يک بايت خرج مي شود در صورتي که اگر Sub-Chipها کنار هم قرار گيرند Chipها درست مي شوند و اگر Chipها کنار هم قرار گيرند Bitها درست شده و تازه از کنار هم قرار گرفتن هشت بيت يک بايت ساخته مي شود! لذا پسنديده تر آنست که ما ابتدا آنقدر صبر کنيم که يک بايت کامل را دريافت کنيم و بعد آن را در حافظه ذخيره نماييم.

براي دستيابي به اين مهم احتياج به شمارنده اي براي شمارش Sub-Chipهايي که يک Chip را مي سازند و شمارنده اي براي شمارش Chipهايي که يک Bit را مي سازند و شمارنده اي براي شمارش بيتهايي که يک بايت را درست مي کنند، است. در ضمن از کنار هم قرار گرفتن بايتها نيز Packetها يا Frameها به وجود مي آيند که مي توان براي آنها هم شمارنده اي در نظر گرفت.

اين کلاس جزو آن دسته از کلاسهايي است که مي توان در آينده بر روي آن مانور داد و دسته شمارنده که شامل شمارنده بايت[12]، شمارنده بيت[13]، شمارنده چيپ[14] و شمارنده ساب-چيپ[15] است را براي فرستنده ها و گيرنده ها در آن در نظر گرفت. اين طرز فکر نه تنها به خوانايي بيشتر برنامه کمک مي کند بلکه ساختار مفهومي پروژه را نيز تقويت مي کند و مفاهيم پنهان موجود در پروژه را براي خوانندگان و کاربران روشن تر مي کند زيرا برخي از خواص کلاسهاي پيچيده اي چون CTx که مربوط به فرستنده است و CRx که مربوط به گيرنده است، را در کلاسهاي ساده تري چون اين کلاس بيان مي کند. در ضمن هنگامي که از کلاس CBuffer در اين پروژه استفاده شود و براي فرستنده ها و گيرنده ها مفاهيمي چون Multiple-Buffer Managing پيش آيد، نياز به چنين کلاسي ضروري مي باشد زيرا هر objectي CBufferاي بايد براي خود objectي CCounterي جداگانه اي داشته باشد که بتوان اطلاعات ارسالي و يا دريافتي را با آن کنترل کرد.

کلاس CCRC

از کلاسهاي مشتق شده، بچه کلاس[16]، از کلاس CFrame مي باشد که وظيفه ساخت و ذخيره CRC[17] مربوط به يک فريم را با توجه به الگوريتم از پيش تعريف شده بر عهده دارد. البته به دليل آنکه اين پروژه در حال حاضر تنها بر روي لايه فيزيکي[18] شبکه کار مي کند نيازي به اضافه کردن Error Detection احساس نمي شد ولي در آينده مي توان به عنوان يکي از سرويسهاي لايه پيوند داده ها[19] از آن استفاده کرد. متغيرهاي اين کلاس شامل متغير str به عنوان آرايه اي از کاراکترهاست که نشاندهنده CRC به صورت اسکي کد مي باشد و متغير size که اندازه و تعداد کاراکترهاي اين آرايه را نشان مي دهد، ميباشد.

کلاس CData

براي تعريف اطلاعات و داده مي توان از اين کلاس استفاده کرد. واحد ساختماني داده ها از نوع بيت از کلاس CBit است که هنگام تعريف ديتا مي توان تعداد بيتهاي به کار رفته در آرايه بيتها در متغير bit را مشخص نمود. به علاوه تعداد چيپهاي به کار رفته در هر بيت و تعداد Sub-Chipها[20]ي به کار رفته در هر چيپ را نيز مي توان تعيين کرد تا بر اساس آنها مقدار حافظه مورد نياز در constructorي کلاس براي بيتها و چيپهاي بيتها و Sub-Chipهاي چيپها اختصاص داده شود. اين کلاس به عنوان واحد اطلاعاتي در کلاسهاي CTx و CRx مورد استفاده قرار مي گيرد و پس از پرشدن يک واحد از آن پردازشهاي لازم در کلاسهاي فرستنده و گيرنده بر روي آن صورت مي گيرد.

کلاس CDataDialog

اين کلاس به صورت يک کلاس ديالوگي است که با ديالوگ Data Definition با شناسه IDD_DataDialog کار مي کند و براي گرفتن اطلاعات در دو نوع باينري و کاراکتري (اسکي کد) به صورت مستقيم از کاربر قرار داده شده است. نوع اطلاعات توسط Radio-Buttonها در صفحه ديالوگ تعيين شده و به صورت يک عدد صحيح در متغير DataType ريخته مي شود. همچنين بر حسب آنکه نوع اطلاعات را چه چيزي قرار دهيد در نهايت داده ها به صورت رشته اي از کاراکترها در متغير strdataي کلاس ريخته مي شود و در نهايت در اختيار کلاس CTxDialog براي پردازش و پر کردن بافر فرستنده از داده ورودي قرار مي گيرد.

کلاس CFIR

اين کلاس براي تعريف يک فيلتر FIR به کار مي رود. متغيرهاي به کار رفته در آن شامل FilterDegree و hn مي باشند که به ترتيب نشاندهنده درجه فيلتر FIRي مرد نظر و آرايه اي از اعداد اعشاري از نوع double مي باشند. ضرايب فيلتر در آرايه hn از طريق ديالوگ FIR Profile قرار داده مي شوند. اين کلاس داراي تابعي به نام SetFilterDegree(int FD=0) مي باشد که با آن مي توان درجه فيلتر را تغيير داد و در نتيجه همانند constructorي کلاس، اين تابع براي درجه جديد مقدار مورد نياز حافظه را براي متغير hn اختصاص مي دهد و تمام حافظه تخصيصي قبلي را آزاد مي کند.

کلاس CFIRDialog

از اين کلاس براي وارد کردن درجه و ضرايب فيلترهاي FIRي موجود در objectي mediumي شبکه استفاده مي شود. اين کلاس با ديالوگ FIR Profile با شناسه IDD_DFIRDialog کار مي کند. بر اساس درجه ورودي کاربر تعداد فيلدهاي مناسب در objectي CMSFlexGrid قرار مي دهد تا به اندازه درجه فيلتر فيلد براي وارد کردن ضرايب در Flex Grid داشته باشيم.

کلاس CFrame

براي تعريف Frameها در اين پروژه مي توان از کلاس اخير استفاده کرد. يک objectي CFrame حاوي تمامي مشخصات يک Frame مي باشد. متغير header که حاوي اطلاعات مربوط به هدر فريم مي باشد و از نوع کلاس CHeader تعريف شده است. متغير payload که تنها آرايه اي از کاراکترهاست و از نوع CString مي باشد. متغير crc که حاوي Cyclic Redundancy Checkي کل فريم مي باشد و از نوع کلاس CCRC مي باشد. متغير str از نوع CString که کل کاراکترهاي فريم را در بر دارد و هر بار با تابع Update() مي توان محتويات آن را بر اساس header و crc جديد نوسازي کرد.

کلاس CGetNumDialog

اين کلاس براي گرفتن عددي اعشاري از کاربر طراحي شده است. اين کلاس با ديالوگ Enter Your Number با شناسه IDD_Ddouble کار مي کند و جزو زير ديالوگ کلاس CFIRDialog محسوب مي شود که عدد دريافتي را به ضرايب فيلتر FIRي ديالوگ CFIRDialog اضافه يا تصحيح مي کند. تنها متغير کلاس number است که عددي از نوع double مي باشد و پارامتر تنها Edit Boxي اين ديالوگ کلاس مي باشد.

کلاس CHeader

از کلاسهاي مشتق شده از CFrame مي باشد که محتوي اطلاعات مربوط به هدر فريمها مي باشد و مي توان بر اساس حالتهاي مختلف کنترلي و سنکرون شدن کاراکترهاي آن را تغيير داد. اين کلاس تنها از دو متغير str که آرايه کاراکترهاي هدر را نشان مي دهد و size که طول اين آرايه را نشان مي دهد، استفاده مي کند.

کلاس CMainFrame

از کلاسهاي پيش ساخته MFC مي باشد که VC++ براي کار با پنجره اصلي پروژه آن را به خدمت مي گيرد. براي استفاده از Status Bar و Tool Barي پروژه از اين کلاس استفاده مي شود ولي متغيرها و توابع آن در روند اصلي کار پروژه هيچ دخالت يا تاثيري ندارند.

کلاس CMedium

کلاس CMedium براي تعريف Medium يا فضاي حايل بين فرتنده ها و گيرنده ها به کار مي رود. اين کلاس در واقع تمام اطلاعات مربوط به فضاي بين هر فرستنده با هر گيرنده اي را در بر دارد. براي اين کار از يک ماتريس دو بعدي که يک بعد آن به اندازه تعداد فرستنده هاست و بعد ديگر به اندازه تعداد گيرنده هاست استفاده مي کند. هر عضو يا درايه اين ماتريس خود يک اشاره گر به يک فيلتر FIR مي باشد که از طريق اين فيلتر مي توان فضاي بين فرستنده i و گيرنده j را با يک فيلتر FIR مدلسازي نمود و از طريق ديالوگ CMediumDialog آن را اضافه يا اصلاح کرد.

متغيرهاي اين کلاس به شرح زيرند:

متغير NumTx که برابر تعداد فرستنده هاست به عنوان بعد افقي يا تعداد رديفهاي ماتريس فيلتر FIR.

متغير NumRx که برابر تعداد گيرنده هاست به عنوان بعد عمودي با تعداد ستونهاي ماتريس.

متغير H که از نوع CFIR*** تعريف شده است. هر کدام از ستاره ها نشاندهنده اشاره گر مي باشند و چون مي خواهيم که ماتريسي دو بعدي داشته باشيم که هر درايه آن يک اشاره گر به کلاس فيلتر FIR باشد يعني از نوع CFIR* باشد لذا بايستي از سه ستاره براي اشاره به رديف موردنظر ماتريس و بعد اشاره به ستون موردنظر آن رديف از ماتريس و در نهايت براي اشاره به فيلتر FIRي موردنظر در آن رديف و ستون مذکور، استفاده کنيم. بقيه متغيرها براي حرکت دادن و کليک کردن Buttonي ساخته شده اين کلاس در Documentي پروژه مورد استفاده قرار مي گيرد و با مراجعه به commentي source codeي برنامه مي توانيد از آنها و وظايفشان اطلاع پيدا کنيد.

کلاس CMediumDialog

از اين کلاس ديالوگي براي ديدن ماتريس فيلترهاي FIRاي که بين هر فرستنده و هر گيرنده در نظر گزفته مي شود و کليک کردن آنها براي تغيير پارامترها و ضرايب فيلترها استفاده مي شود. همچنين مي توانيد ماتريسي را که تنظيم کرده ايد بر روي فايل ذخيره کنيد و يا فايلي را که قبلا ماتريس در آن ذخيره شده را باز کنيد و يا اينکه همه مقادير را reset کنيد. ديالوگ Medium Profile با شناسه IDD_DMediumProfile در ارتباط با اين کلاس است. متغيرهاي تعريف شده در آن همانند متغيرهاي تعريف شده در کلاس CMedium مي باشد.

کلاس CMSFlexGrid

اين کلاس به دليل اضافه شدن ActiveXي Microsoft Flex Grid به اين پروژه خودبخود توسط VC++ به کلاسهاي WorkSpaceي برنامه اضافه می شود. از اين کلاس و کلاسهاي پشتيبان آن، چون کلاس COleFont، کلاس CPicture و کلاس CRowCursor براي نشان دادن ماتريس فيلترهاي FIR و ضرايب اين فيلترها استفاده شده است.

کلاس COCNSApp

از اين کلاس براي نمايش اصلي ترين پنجره ي پروژه استفاده مي شود. اين کلاس از نوع کلاس CwinAppي خود Windows مي باشد و در حقيقت handleي اين نرم افزار را در اختيار دارد و اين handle را در اختيار Windows هم قرار مي دهد. در حقيقت اصلي ترين کلاس پروژه که حاکم بر نرم افزار است، مي باشد.

کلاس COCNSCntrlItem

از اين کلاس که از نوع COleClientItem است، براي کنترل Itemهاي مختلف پروژه که مهمترين آنها دو objectي COleDocument و CView مي باشند، استفاده مي شود.

کلاس COCNSDoc

اين کلاس از کلاسهاي پيش ساخته توسط VC++ مي باشد که براي کار با صفحه Documentي پروژه قرار داده شده است. از نوع objectي COleDocument است و داراي توابعي براي پرينت کردن و Save کردن يا Load کردن Document مي باشد.

کلاس COCNSView

از اين کلاس مي توان براي کار با ادوات Visualي برنامه چون Menu Bar و هر آنچه که بر روي پنجره پروژه به نمايش در مي آيد مانند Buttonها، شکلها، همه کنترلها و ديگر چيزها. اين کلاس هم به صورت اتوماتيک با تعريف يک پروژه MFC در VC++ به وجود مي آيد.

کلاس COleFont

اين کلاس به دليل اضافه شدن ActiveXي Microsoft Flex Grid به اين پروژه خودبخود توسط VC++ به کلاسهاي Work Spaceي برنامه اضافه شده است. از اين کلاس و کلاسهاي پشتيبان آن، چون کلاس CMSFlexGrid و کلاس CPicture و کلاس CRowCursor براي نشان دادن ماتريس فيلترهاي FIR و ضرايب اين فيلترها استفاده شده است.

کلاس CPicture

اين کلاس به دليل اضافه شدن ActiveXي Microsoft Flex Grid به اين پروژه خودبخود توسط VC++ به کلاسهاي Work Spaceي برنامه اضافه شده است. از اين کلاس و کلاسهاي پشتيبان آن، چون کلاس CMSFlexGrid و کلاس COleFont و کلاس CRowCursor براي نشان دادن ماتريس فيلترهاي FIR و ضرايب اين فيلترها استفاده شده است.

کلاس CRowCursor

اين کلاس به دليل اضافه شدن ActiveXي Microsoft Flex Grid به اين پروژه خودبخود توسط VC++ به کلاسهاي Work Spaceي برنامه اضافه شده است. از اين کلاس و کلاسهاي پشتيبان آن، چون کلاس CMSFlexGrid و کلاس CPicture و کلاس COleFont براي نشان دادن ماتريس فيلترهاي FIR و ضرايب اين فيلترها استفاده شده است.

کلاس CRxDialog

از اين کلاس ديالوگي براي وارد کردن يک سري از خصوصيات گيرنده ها از طريق کاربر استفاده مي شود. ديالوگ Receiver Profile با شناسه IDD_DReceiverProfile در ارتباط با متغيرهاي اين کلاس و گرفتن مقدار متغيرها از کاربر کار مي کند.

کلاس CSim

از اين کلاس براي تعريف کردن تمام مشخصات يک objectي شبيه سازي استفاده مي شود. اصلي ترين کلاس پروژه که بقيه متغيرهاي کلاسهاي ديگر از طريق آن تعريف مي شوند. لذا کلاسهايي مانند CMedium، CTx، CRx و CCode در آن #include مي شوند تا از آنها objectهايي به صورت آرايه اي ساخته شود.

در اين کلاس براي ذخيره objectهاي فرستنده، گيرنده و کد از کلاس CObArray استفاده شده است که به محض تعريف يکي از اين متغيرها توسط کاربر براي objectي آن فضاي لازم اختصاص داده شده و تنها handleي آن در آرايه مربوطه ذخيره مي شود. اين آرايه ها عبارتند از TXs، RXs و codes که همگي از نوع CObArray اند و حاوي handleهاي به ترتيب فرستنده ها، گيرنده ها و کدها مي باشند و از طريق متغيرهاي CTx* tx;، CRx* rx و CCode* code در اين کلاس توسط خواست کاربر در RAM تعريف مي شوند. فضا چون به صورت يک تک متغير است تنها يکبار توسط متغير CMedium* medium; در کلاس CSim تعريف مي شود و نيازي به استفاده آرايه با استفاده از CObArray براي آن نيست.

با مراجعه به source codeي برنامه و مطالعه commentهاي کلاس CSim متوجه مي شويد که پارامترهاي توليد کدهاي متعامد مانند طول کد، وزن کد و پارامترهاي حداکثر Collision نيز در اين کلاس مورد استفاده قرار مي گيرند تا بر اساس مقادير ورودي کاربر براي اين متغيرها، کدهاي متعامد نوري توليد شوند. همچنين پارامتر حداکثر اندازه يک مجموعه کد نيز با استفاده از الگوريتم Johnson Bound تعيين مي شود. متغيرهايي نيز براي تعيين زمان دقيق عمل شبيه سازي وجود دارد که اين زمان را بر حسب Sub-Chip، Chip، بيت و بايت به ترتيب بوسيله ClockSubChip، ClockChip، ClockBit و ClockByte کنترل مي کنند. بقيه متغيرها که عموما توسط کاربر تنظيم مي شوند و در فصل قبل هم در مورد آنها توضيح داده شد را در source code مي توانيد ببينيد.

مهمترين توابع استفاده شونده در اين کلاس دو تابع Clock() و InitClock() مي باشد که اينها در واقع برنامه کلاک فرستنده ها و گيرنده ها را Initialize کرده و در هر مرحله عمل شبيه سازي کلاک آنها را از طريق handleهاي آنها که در CObArray موجود است، فراخواني مي کند. البته ابتدا کلاک فرستنده ها را اجرا مي کند و بعد با اجراي برنامه CoupleData() تمام وروديهاي گيرنده ها را توسط خروجي فرستنده ها و فيلترهاي FIRي موجود در medium بدست مي آورد و بعد کلاک گيرنده ها را اجرا مي کند.

کلاس CSimDialog

از اين کلاس براي وارد کردن برخي از متغيرهاي کلاس CSim که لزوما بايد از طريق کاربر وارد شود، استفاده مي شود که در فصل قبل طريقه وارد کردن و نام آنها ذکر شد. اين کلاس در ارتباط با ديالوگ Simulation Profile مي باشد و شناسه ديالوگ آن هم در source fileي پروژه IDD_SimDialog مي باشد. متغيرهاي موجود در اين کلاس بسيار مشابه متغيرهاي کلاس CSim مي باشد و نيازي به معرفي ندارد. از اين کلاس براي ساختن، اصلاح، ذخيره و باز کردن يک Simulationي که قبلا ذخيره شده است هم مي توان استفاده کرد..

کلاس CSimShowDialog

کلاس اخير از کلاسهاي ديالوگي پروژه مي باشد که با ديالوگ CSimShow با شناسه IDD_SimShowDialog کار مي کند. وظيفه اين کلاس نمايش اتفاقاتي است که در حين عمل شبيه سازي مي افتد. در واقع کلاس ديالوگي اخير مي تواند سيگنال ورودي به فقط يک فرستنده و فقط يک گيرنده را همزمان در حين عمل شبيه سازي در Edit Boxهاي موجود در قسمت State of System نشان دهد. در ضمن مي تواند وقايع مهمي چون Acquision و Trackingي گيرنده ها را نيز در List Boxي موجود در صفحه ديالوگ نمايش دهد. البته بايد قبل از آن نمايش اين پارامترها با انتخاب گزينه هاي "on" در هر کدام از قسمتها آنها را فعال کرده باشيد. از مهمترين قابليتهاي اين کلاس تنظيم سرعت عمل شبيه سازي است. به محض باز شدن ديالوگ کلاس در تابع OnInitDialog()ي کلاس يک تايمر با زمان Interruptي حداکثر 100ms ساخته مي شود. سپس از طريق objectي CSim* sim روال InitClock()ي تمام فرستنده ها و گيرنده ها نيز اجرا مي شود. با زدن دکمه Resume/Pause در صفحه عمل شبيه سازي آغاز مي شود و تابع کلاک کلاس CSim در هر بار Interrupt دادن تايمر يکبار اجرا مي شود. به اين ترتيب با تغيير زمان Interruptي تايمر از طريق اسلايدر Master Speed مي توان سرعت شبيه سازي را تغيير داد.

همچنين مي توان با استفاده از دو اسلايدر ديگر نيز مي توان سرعت را تنظيم کرد. به اين صورت که اين دو اسلايدر هر کدام عددي مابين يک تا صد را مشخص مي کنند که حاصلضرب آنها تعداد بارهاي اجراي برنامه کلاک کلاس CSim را در يکبار Interrupt دادن تايمر مشخص مي کند لذا با کم و زياد کردن اسلايدرها (به صورت پيش فرض اسلايدرهاي پاييني روي کمترين مقدار يعني عدد يک ست مي شوند) مي توان باز هم سرعت را تنظيم کرد! در عمل سرعت شبيه سازي از يک حدي بيشتر نمي شود که عامل اين محدوديت همان سرعت CPU مي باشد. لذا بعد از يک حدي ديگر سرعت شبيه سازي افزوده نمي گردد و چون CPU مجبور مي شود که با تمام ظرفيت خويش کار کند، چنين احساس مي شود که کامپيوتر اصطلاحا Hang کرده است. ولي در اين حالت نيز شما مي توانيد دکمه Resume/Pause را فشار دهيد و بعد از مدتي کلمه Pauseي آن Resume مي شود و عمل شبيه سازي متوقف مي شود و شما مي توانيد سرعت را براحتي کاهش دهيد و دوباره عمل شبيه سازي را راه اندازي کنيد.

کلاس CTxDialog

از اين کلاس ديالوگي براي وارد کردن يک سري از خصوصيات فرستنده ها از طريق کاربر استفاده مي شود. ديالوگ Transmitter Profile با شناسه IDD_DTransmitterProfile در ارتباط با متغيرهاي اين کلاس و گرفتن مقدار متغيرها از کاربر کار مي کند.

کلاس CTxRx

از اين کلاس مي توان براي تعريف يک objectي کامل Full Duplex يعني هم فرستنده هم گيرنده استفاده کرد. در حال حاضر براي اين کلاس طراحي صورت نگرفته است بلکه در آينده براي طراحي آن اقدامي صورت گيرد. در اين صورت بايد بسياري تصميمگيريها و برنامه ريزيها هم در رابطه با زمانبندي ارسال و دريافت اين object صورت بپذيرد.

کلاس CTxRxDialog

از اين کلاس ديالوگي براي وارد کردن يک سري از خصوصيات فرستنده-گيرنده ها از طريق کاربر استفاده مي شود. ديالوگ TxRx Profile با شناسه IDD_DTxRxProfile در ارتباط با متغيرهاي اين کلاس و گرفتن مقدار متغيرها از کاربر کار مي کند.

[1] Optical CDMA Network Simulator

[2] Chip

[3] Sub-Chip

[4] BYTE, a number between 0 to 255

[5] Value

[6] Integer

[7] Intensify

[8] Optical Orthogonal Code (OOC)

[9] Generation

[10] 1-chip is meant the chip that its value is equal with one.

[11] Cross-correlation Constraint

[12] ByteCounter

[13] BitCounter

[14] ChipCounter

[15] SubChipCounter

[16] Child Class

[17] Cyclic Redundancy Check

[18] Physical Layer

[19] Data-Link Layer

[20] SubChipSize