Міністерство освіти і науки України
Рівненська Мала академія наук учнівської молоді
Педагогічний ліцей при Рівненському державному гуманітарному університеті
КОМП’ЮТЕРНІ ПРОГРАММИ ДЛЯ АВТОМАТИЗАЦІЇ НАУКОВИХ ДОСЛІДЖЕНЬ ТА РОЗРАХУНКІВ
АВТОМАТИЗОВАНА СИСТЕМА РЕЄСТРАЦІЇ ІОНІЗУЮЧИХ ВИПРОМІНЮВАНЬ
роботу
Зміст
І. Вступ………………………………………………………………………………3
ІІ. Опис алгоритмів програм:
редактор завдань і результатів……………………………………………5
контролер LPT – порту. Версія DOS……………………………………..8
контролер LPT – порту. Версія Windows…………………………….…10
ІІІ. Узгоджуючий пристрій………………………………………………………...11
ІV. Висновки………………………………………………………………………..12
V. Додатки:
1) текст програми редактора завдань і результатів……………………….13
2) текст програми контролера LPT порту:
- версія DOS………………………………………………………………31
- версія Windows………………………………………………………….34
VI. Список літератури………………………………………………………...……40
I. Вступ
Розвиток ядерної фізики вимагає вимірювання кількості випромінюваних частинок, їх енергії, швидкості, вивчення їх траєкторій тощо. Розміри окремих частинок (електронів, протонів, альфа-частинок) такі, що безпосередньо спостерігати їх не можна навіть за допомогою електронного мікроскопа. Однак фізики сконструювали прилади, які дають можливість реєструвати частинки, спостерігати їх траєкторії.
Частинки великих енергій, що випромінюються під час радіоактивних перетворень, входять до складу космічних променів або створюються на спеціальних потужних прискорювачах. Вони можуть іонізувати молекули, впливати на фотопластинку, викликати свічення деяких речовин тощо. За цими проявами можна спостерігати частинки, реєструвати їх, відрізняти одну від одної і вимірювати енергію.
Одним з найпростіших приладів є лічильник Гейгера—Мюллера. Значного підсилення слабких іонізаційних струмів, обумовлених іонізацією газу навіть однією швидкою частинкою або гамма-квантом, можна досягти, скориставшись явищем ударної іонізації. Це і використовується в будові лічильників Гейгера – Мюллера, швидке клацання яких добре знайоме з багатьох популярних кінофільмів. Проникаючи в трубку, проміння іонізує атоми на своєму шляху. Виникаючі вільні електрони й іони, прискорюючись електричним полем між ниткою і стінками, здійснюють іонізацію, яка веде до пробивання газу. Відбувається електричний розряд, і сила струму через нитку різко зростає. Імпульс напруги з навантаження подається в реєструючий пристрій. Ним може бути світловий або звуковий індикатор, механічний або електричний лічильник.
У випадку одноразового вимірювання активності зразка згадані реєструючі пристрої цілком задовольняють дослідника. Але досить часто в науці виникають завдання, пов’язані з багаторазовим вимірюванням активності зразка протягом тривалого проміжку часу. Наприклад, при визначенні ізотопного складу ( - радіоактивних аерозолів повітря. При цьому часто мають справу не з одним, а з кількома зразками. Така робота потребує великої пильності дослідника, щоб не помилитись коли і з якого зразка зняти покази активності.
Автором цієї роботи поставлено завдання створити на основі комп’ютера (не обов’язково сучасного) програмний комплекс для автоматизації вимірювань за допомогою лічильника Гейгера – Мюллера. При цьому передбачено можливість вимірювання чотирма лічильниками одночасно. Таким чином, без втручання людини можна досліджувати три зразки. Один лічильник повинен вимірювати природній фон, інші реєструвати випромінювання зразків. В залежності від програми, закладеної дослідником, в потрібний момент часу вмикається потрібний лічильник і комп’ютером реєструється іонізуюче випромінювання. Результати зберігаються у файлі, до якого в зручний час може звернутись дослідник.
Комплекс складається з двох програм:
редактор завдань і результатів;
контролер LPT – порту.
Для під’єднання лічильника до комп’ютера і безпечної роботи LPT – порту створено узгоджуючий пристрій.
II. Опис алгоритмів програм
Редактор завдань
Програма створена для зручного перегляду та редагування файлів завдань. Для створення було використано компілятор MS Visual C++ 6.0. Після завантаження програма шукає в поточному каталозі файли завдань: count1.tsk, count2.tsk, count3.tsk. У цих файлах збережені завдання для кожного лічильника. Якщо файла не існує, то лічильник використовуватись не буде. При знаходженні одного з файлів програма починає зчитувати завдання в оперативну пам’ять. Структура файлу завдань:
Поле NAME визначає ім’я завдання для редактора. Поле N визначає кількість завдань для даного лічильника. Поле DATE визначає дату початку вимірювання у форматі DD.MM.YYYY. Полe TIME визначає час початку вимірювання у форматі HH:MM. Поле TIME2 визначає тривалість вимірювання у хвилинах. Поле COUNT визначає кількість повторів. Після того, як дані були зчитані, вони заносяться в таблицю для зручного перегляду (мал. 1) та редагування. Використовуючи цей редактор, можна створювати файли завдань для нових лічильників, натискаючи на кнопку ”Нове завдання” (мал. 2). Але одночасно не може існувати більше 3 лічильників. Можна додавати нові завдання для вже існуючих лічильників, натискаючи на кнопку “Додати” (мал. 3). Натиснувши на кнопку «результати», можна переглянути результати здійснених вимірювань (мал. 4). Структура файлiв результатів:
Поле N – кількість вимірювань даним лічильником. Поля DATE i TIME – дата і час вимірювань(згідно формату файлу завдань). Поле COUNT – кількість зафіксованих імпульсів.
Мал. 1
Мал. 2 Мал. 3.
Мал. 4
2. Контролер LPT порту. Версія для DOS:
Програма створена для контролю паралельного порту і реєстрації поступаючих імпульсів. Після завантаження програма шукає у поточному каталозі файли завдань, після цього дані зчитуються в оперативну пам’ять. Циклічно, через кожні 30 секунд, програма перевіряє відповідність системної дати і часу з датою і часом, вказаних у файлах завдань. Якщо знайдено співпадання – починає працювати процедура реєстрації імпульсів.
Якщо немає жодного невиконаного завдання – вихід з програми.
3. Програма для контролю LPT порта. Версія для Windows:
Програма працює за тим самим алгоритмом, що і версія для DOS, але для контролю порту використовується бібліотека inpout32.dll
III. Узгоджуючий пристрій
Для вмикання лічильників використовується схема відображена на малюнку 3.1.
Мал. 3.1
“Signal” – це посилання з одного з data регістрів LPT (0 або 1). Оптопара використана 4N25. Котушка в колі колектор – емітер транзистора – реле РЭС-22, яке комутує лічильник на вмикання.
Для реєстрації імпульсів з лічильника Гейгера-Мюллера створена схема за малюнком 3.2. 9В – це живлення від зовнішнього джерела. 5В – можна брати безпосередньо з блоку живлення комп’ютера.
Мал. 3.2
І в першому, і в другому випадку використовуються оптопари щоб запобігти потраплянню на LPT - порт небажаної напруги, яка може з’явитись при перегорянні компонентів узгоджуючого пристрою.
IV. Висновки
Програмний комплекс тестувався з такими версіями Windows: Windows95, Windows98, WindowsХР. Помилки під час роботи не виникали, отже можна зробити висновок, що програми працюють коректно і не заважають операційній системі. Особливо привабливою є версія під DOS. Ця версія умисно тестувалась на комп’ютері з такою конфігурацією: процесор 80286, розмір оперативної пам’яті 1024 Кб, HDD 40 Мб. Проблем не виникло. Це означає, що для автоматизації вимірювань поряд із сучасними комп’ютерами можна використовувати і застарілі машини, які в багатьох установах не задіяні в роботу.
Узгоджуючий пристрій є експериментальним, тому для економії радіодеталей виготовлений для роботи з двома лічильниками. Але програма-контролер LPT – порту повноцінна – контролює всі чотири порти. При бажанні пристрій легко доповнюється необхідними компонентами для роботи до 8 лічильників.
Оскільки програма-контролер LPT – порту працює з лічильниками через узгоджуючий пристрій, то при бажанні можна переробити цей пристрій для підключення лічильників іншого типу, наприклад, сцинтиляційних, і програма буде контролювати інші лічильники. Головне, щоб від узгоджуючого пристрою на вхід LPT – порту подавався імпульс напруги до +5В.
V. Додатки
1. Текст програми редактора завдань і результатів
AddTask.h
#if !defined(AFX_ADDTASK_H__521915FC_2751_4E86_B3AB_0311C20D30DB__INCLUDED_)
#define AFX_ADDTASK_H__521915FC_2751_4E86_B3AB_0311C20D30DB__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// AddTask.h : header file
//
/////////////////////////////////////////////////////////////////////////////
// CAddTask dialog
class CAddTask : public CDialog
{
// Construction
public:
CAddTask(CWnd* pParent = NULL); // standard constructor
// Dialog Data
//{{AFX_DATA(CAddTask)
enum { IDD = IDD_ADDTASK };
// NOTE: the ClassWizard will add data members here
//}}AFX_DATA
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAddTask)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
// Generated message map functions
//{{AFX_MSG(CAddTask)
afx_msg void OnAdd();
afx_msg void OnCancel();
virtual BOOL OnInitDialog();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_ADDTASK_H__521915FC_2751_4E86_B3AB_0311C20D30DB__INCLUDED_)
Editor2.h
// Editor2.h : main header file for the EDITOR2 application
//
#if !defined(AFX_EDITOR2_H__DCFEAA6F_8351_4988_95AF_CF804D3DA389__INCLUDED_)
#define AFX_EDITOR2_H__DCFEAA6F_8351_4988_95AF_CF804D3DA389__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#ifndef __AFXWIN_H__
#error include 'stdafx.h' before including this file for PCH
#endif
#include "resource.h" // main symbols
/////////////////////////////////////////////////////////////////////////////
// CEditor2App:
// See Editor2.cpp for the implementation of this class
//
class CEditor2App : public CWinApp
{
public:
CEditor2App();
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CEditor2App)
public:
virtual BOOL InitInstance();
//}}AFX_VIRTUAL
// Implementation
//{{AFX_MSG(CEditor2App)
// NOTE - the ClassWizard will add and remove member functions here.
// DO NOT EDIT what you see in these blocks of generated code !
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
/////////////////////////////////////////////////////////////////////////////
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_EDITOR2_H__DCFEAA6F_8351_4988_95AF_CF804D3DA389__INCLUDED_)
Editor2Dlg.h
// Editor2Dlg.h : header file
//
#if !defined(AFX_EDITOR2DLG_H__DDD48058_20A8_47F1_ADD7_BADC863F060C__INCLUDED_)
#define AFX_EDITOR2DLG_H__DDD48058_20A8_47F1_ADD7_BADC863F060C__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
/////////////////////////////////////////////////////////////////////////////
// CEditor2Dlg dialog
class CEditor2Dlg : public CDialog
{
// Construction
public:
CEditor2Dlg(CWnd* pParent = NULL); // standard constructor
// Dialog Data
//{{AFX_DATA(CEditor2Dlg)
enum { IDD = IDD_EDITOR2_DIALOG };
CTabCtrl m_Tab;
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CEditor2Dlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
void LoadTasks();
void LoadResults();
bool result;
HICON m_hIcon;
// Generated message map functions
//{{AFX_MSG(CEditor2Dlg)
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
afx_msg void OnNewtask();
afx_msg void OnResult();
afx_msg void OnTask();
afx_msg void OnSelchangeTab1(NMHDR* pNMHDR, LRESULT* pResult);
afx_msg void OnExit();
afx_msg void OnRclickTab1(NMHDR* pNMHDR, LRESULT* pResult);
afx_msg void OnAbout();
afx_msg void OnHelp();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_EDITOR2DLG_H__DDD48058_20A8_47F1_ADD7_BADC863F060C__INCLUDED_)
NewName.h
#if !defined(AFX_NEWNAME_H__6E0E6D5D_443B_40EB_97D2_594802779D50__INCLUDED_)
#define AFX_NEWNAME_H__6E0E6D5D_443B_40EB_97D2_594802779D50__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// NewName.h : header file
//
/////////////////////////////////////////////////////////////////////////////
// CNewName dialog
class CNewName : public CDialog
{
// Construction
public:
CNewName(CWnd* pParent = NULL); // standard constructor
// Dialog Data
//{{AFX_DATA(CNewName)
enum { IDD = IDD_NEWNAME };
// NOTE: the ClassWizard will add data members here
//}}AFX_DATA
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CNewName)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
// Generated message map functions
//{{AFX_MSG(CNewName)
afx_msg void OnButton1();
virtual BOOL OnInitDialog();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_NEWNAME_H__6E0E6D5D_443B_40EB_97D2_594802779D50__INCLUDED_)
Resource.h
//{{NO_DEPENDENCIES}}
// Microsoft Developer Studio generated include file.
// Used by Editor2.rc
//
#define IDM_ABOUTBOX 0x0010
#define IDD_ABOUTBOX 100
#define IDS_ABOUTBOX 101
#define WM_TABCHANGE 101
#define IDD_EDITOR2_DIALOG 102
#define WM_DELETEALL 102
#define IDD_TASKPAGE 103
#define IDR_MAINFRAME 128
#define IDD_ADDTASK 129
#define IDD_RESULTPAGE 130
#define IDD_NEWNAME 131
#define IDI_ICON1 132
#define IDC_TAB1 1000
#define IDC_RESULT 1001
#define IDC_TASK 1002
#define IDC_LIST1 1002
#define IDC_NEWTASK 1003
#define IDC_ADD 1003
#define IDC_DELETE 1004
#define IDC_DATE 1004
#define IDC_HELP 1004
#define IDC_DELETEALL 1005
#define IDC_TIME 1005
#define IDC_EDIT 1006
#define IDC_TIMESPAN 1006
#define IDC_COUNT 1007
#define IDC_FILENAME 1008
#define IDC_CANCEL 1009
#define IDC_SAVE 1011
#define IDC_EXIT 1012
#define IDC_FILENAMEST 1013
#define IDC_NAME 1014
#define IDC_BUTTON1 1015
#define IDC_ABOUT 1016
#define IDC_ERROR 1017
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 133
#define _APS_NEXT_COMMAND_VALUE 32771
#define _APS_NEXT_CONTROL_VALUE 1018
#define _APS_NEXT_SYMED_VALUE 103
#endif
#endif
ResultPage.h
#if !defined(AFX_RESULTPAGE_H__9437A44E_B2D5_4461_8A25_1B42FDD1B955__INCLUDED_)
#define AFX_RESULTPAGE_H__9437A44E_B2D5_4461_8A25_1B42FDD1B955__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// ResultPage.h : header file
//
/////////////////////////////////////////////////////////////////////////////
// CResultPage dialog
class CResultPage : public CDialog
{
// Construction
public:
void OnChange();
CResultPage(CWnd* pParent = NULL); // standard constructor
// Dialog Data
//{{AFX_DATA(CResultPage)
enum { IDD = IDD_RESULTPAGE };
CListCtrl m_List;
//}}AFX_DATA
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CResultPage)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
// Generated message map functions
//{{AFX_MSG(CResultPage)
virtual BOOL OnInitDialog();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_RESULTPAGE_H__9437A44E_B2D5_4461_8A25_1B42FDD1B955__INCLUDED_)
Stdafx.h
// stdafx.h : include file for standard system include files,
// or project specific include files that are used frequently, but
// are changed infrequently
//
#if !defined(AFX_STDAFX_H__E30D533F_95C7_4AEC_83DA_A149ED1A4247__INCLUDED_)
#define AFX_STDAFX_H__E30D533F_95C7_4AEC_83DA_A149ED1A4247__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers
#include <afxwin.h> // MFC core and standard components
#include <afxext.h> // MFC extensions
#include <afxdisp.h> // MFC Automation classes
#include <afxdtctl.h> // MFC support for Internet Explorer 4 Common Controls
extern CString FileTitles[7];
extern CString FileNames[7];
extern CString CurSel;
extern CString AddType,Date,Time,TimeSpan,Count;
extern UINT nCount;
extern HWND wndTask,wndResult,wndMain;
extern CString NewName;
extern void Save();
struct TASK
{
CString Time,TimeSpan,Date,nCount;
UINT N;
};
extern TASK *task[7];
#ifndef _AFX_NO_AFXCMN_SUPPORT
#include <afxcmn.h> // MFC support for Windows Common Controls
#endif // _AFX_NO_AFXCMN_SUPPORT
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_STDAFX_H__E30D533F_95C7_4AEC_83DA_A149ED1A4247__INCLUDED_)
TaskPage.h
#if !defined(AFX_TASKPAGE_H__1ACB6068_6571_4E83_81FF_73F6FAEA1F30__INCLUDED_)
#define AFX_TASKPAGE_H__1ACB6068_6571_4E83_81FF_73F6FAEA1F30__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// TaskPage.h : header file
//
/////////////////////////////////////////////////////////////////////////////
// CTaskPage dialog
class CTaskPage : public CDialog
{
// Construction
public:
CTaskPage(CWnd* pParent = NULL); // standard constructor
// Dialog Data
//{{AFX_DATA(CTaskPage)
enum { IDD = IDD_TASKPAGE };
CListCtrl m_List;
//}}AFX_DATA
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CTaskPage)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
void OnChange();
void LoadFromID(bool b=false);
// Generated message map functions
//{{AFX_MSG(CTaskPage)
virtual BOOL OnInitDialog();
afx_msg void OnAdd();
afx_msg void OnSave();
afx_msg void OnDelete();
afx_msg void OnDeleteall();
afx_msg void OnEdit();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_TASKPAGE_H__1ACB6068_6571_4E83_81FF_73F6FAEA1F30__INCLUDED_)
AddTask.cpp
// AddTask.cpp : implementation file
//
#include "stdafx.h"
#include "Editor2.h"
#include "AddTask.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CAddTask dialog
UINT nIndex;
CAddTask::CAddTask(CWnd* pParent /*=NULL*/)
: CDialog(CAddTask::IDD, pParent)
{
//{{AFX_DATA_INIT(CAddTask)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
}
void CAddTask::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAddTask)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAddTask, CDialog)
//{{AFX_MSG_MAP(CAddTask)
ON_BN_CLICKED(IDC_ADD, OnAdd)
ON_BN_CLICKED(IDC_CANCEL, OnCancel)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CAddTask message handlers
void CAddTask::OnAdd()
{
UINT i=0,nID;
for (i=0; i<nCount; i++) if (CurSel==FileTitles[i]) { nID = i; break;}
if (AddType =="ADD")
{
TASK *NewTask;
NewTask = new TASK[task[nID][0].N+1];
for (i=0; i<task[nID][0].N; i++)
{
NewTask[i].Date = task[nID][i].Date;
NewTask[i].Time = task[nID][i].Time;
NewTask[i].TimeSpan = task[nID][i].TimeSpan;
NewTask[i].nCount = task[nID][i].nCount;
}
GetDlgItemText(IDC_DATE,NewTask[i].Date);
GetDlgItemText(IDC_TIME,NewTask[i].Time);
GetDlgItemText(IDC_TIMESPAN,NewTask[i].TimeSpan);
GetDlgItemText(IDC_COUNT,NewTask[i].nCount);
NewTask[0].N = ++i;
task[nID] = NewTask;
}
else if (AddType == "EDIT")
{
GetDlgItemText(IDC_DATE,task[nID][nIndex].Date);
GetDlgItemText(IDC_TIME,task[nID][nIndex].Time);
GetDlgItemText(IDC_TIMESPAN,task[nID][nIndex].TimeSpan);
GetDlgItemText(IDC_COUNT,task[nID][nIndex].nCount);
}
else if (AddType == "GLOBAL ADD")
{
CFileFind FileFind;
CString FileName;
while (!FileNames[i].IsEmpty()&&i!=6) ++i;
if (i==6) { MessageBox("Ìîæå áóòè ìàêñèìóì 7 ôàéë³â çàâäàíü","Ïîìèëêà",MB_OK|MB_ICONERROR); EndDialog(0);}
GetDlgItemText(IDC_FILENAME,FileName);
FileTitles[nCount] = FileName;
if (FileName.IsEmpty()) { MessageBox("Ââåä³òü íàçâó çàâäàííÿ","Ïîìèëêà",MB_OK|MB_ICONERROR); return;}
FileName+=".tsk";
if (FileFind.FindFile(FileName)) {MessageBox("Ôàéë ç òàêîþ íàçâîþ âæå ³ñíóº","Ïîìèëêà",MB_OK|MB_ICONERROR); return;}
task[nCount] = new TASK;
task[nCount][0].N=1;
GetDlgItemText(IDC_DATE,task[nCount][0].Date);
GetDlgItemText(IDC_TIME,task[nCount][0].Time);
GetDlgItemText(IDC_TIMESPAN,task[nCount][0].TimeSpan);
GetDlgItemText(IDC_COUNT,task[nCount][0].nCount);
FileNames[nCount] = FileName;
FileName.Find(".tsk",0);
++nCount;
Save();
::PostMessage(wndMain,WM_DELETEALL,0,0);
}
EndDialog(0);
}
void CAddTask::OnCancel()
{
EndDialog(0);
}
BOOL CAddTask::OnInitDialog()
{
CDialog::OnInitDialog();
if (AddType=="GLOBAL ADD")
{
CEdit *ed = (CEdit *) GetDlgItem(IDC_FILENAME);
ed->ShowWindow(SW_SHOW);
CStatic *st = (CStatic *) GetDlgItem(IDC_FILENAMEST);
st->ShowWindow(SW_SHOW);
goto beg;
}
else if (AddType == "ADD")
{
beg:
CTime Time;
Time = CTime::GetCurrentTime();
CString str = Time.Format("%d.%m.%Y");
SetDlgItemText(IDC_DATE,str);
SetDlgItemText(IDC_TIME,Time.Format("%H:%M"));
SetDlgItemText(IDC_TIMESPAN,"10");
SetDlgItemText(IDC_COUNT,"1");
}
else if (AddType=="EDIT")
{
UINT nID,i;
for (i=0; i<nCount; i++) if (CurSel==FileTitles[i]) { nID = i; break;}
for (i=0; i<task[nID][0].N; i++) if (Date==task[nID][i].Date&&Time==task[nID][i].Time&&TimeSpan==task[nID][i].TimeSpan&&Count==task[nID][i].nCount) {nIndex = i; break;};
SetDlgItemText(IDC_DATE,Date);
SetDlgItemText(IDC_TIME,Time);
SetDlgItemText(IDC_TIMESPAN,TimeSpan);
SetDlgItemText(IDC_COUNT,Count);
SetDlgItemText(IDC_ADD,"Çáåðåãòè");
}
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
Editor2.cpp
// Editor2.cpp : Defines the class behaviors for the application.
//
#include "stdafx.h"
#include "Editor2.h"
#include "Editor2Dlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CEditor2App
BEGIN_MESSAGE_MAP(CEditor2App, CWinApp)
//{{AFX_MSG_MAP(CEditor2App)
// NOTE - the ClassWizard will add and remove mapping macros here.
// DO NOT EDIT what you see in these blocks of generated code!
//}}AFX_MSG
ON_COMMAND(ID_HELP, CWinApp::OnHelp)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CEditor2App construction
CEditor2App::CEditor2App()
{
// TODO: add construction code here,
// Place all significant initialization in InitInstance
}
/////////////////////////////////////////////////////////////////////////////
// The one and only CEditor2App object
CEditor2App theApp;
/////////////////////////////////////////////////////////////////////////////
// CEditor2App initialization
BOOL CEditor2App::InitInstance()
{
AfxEnableControlContainer();
// Standard initialization
// If you are not using these features and wish to reduce the size
// of your final executable, you should remove from the following
// the specific initialization routines you do not need.
#ifdef _AFXDLL
Enable3dControls(); // Call this when using MFC in a shared DLL
#else
Enable3dControlsStatic(); // Call this when linking to MFC statically
#endif
CEditor2Dlg dlg;
m_pMainWnd = &dlg;
int nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
// TODO: Place code here to handle when the dialog is
// dismissed with OK
}
else if (nResponse == IDCANCEL)
{
// TODO: Place code here to handle when the dialog is
// dismissed with Cancel
}
// Since the dialog has been closed, return FALSE so that we exit the
// application, rather than start the application's message pump.
return FALSE;
}
Editor2Dlg.cpp
// Editor2Dlg.cpp : implementation file
//
#include "stdafx.h"
#include "Editor2.h"
#include "Editor2Dlg.h"
#include "TaskPage.h"
#include "ResultPage.h"
#include "AddTask.h"
#include "NewName.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CEditor2Dlg dialog
CEditor2Dlg::CEditor2Dlg(CWnd* pParent /*=NULL*/)
: CDialog(CEditor2Dlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CEditor2Dlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
result = false;
nCount = 0;
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CEditor2Dlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CEditor2Dlg)
DDX_Control(pDX, IDC_TAB1, m_Tab);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CEditor2Dlg, CDialog)
//{{AFX_MSG_MAP(CEditor2Dlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_NEWTASK, OnNewtask)
ON_BN_CLICKED(IDC_RESULT, OnResult)
ON_BN_CLICKED(IDC_TASK, OnTask)
ON_NOTIFY(TCN_SELCHANGE, IDC_TAB1, OnSelchangeTab1)
ON_BN_CLICKED(IDC_EXIT, OnExit)
ON_NOTIFY(NM_RCLICK, IDC_TAB1, OnRclickTab1)
ON_BN_CLICKED(IDC_ABOUT, OnAbout)
ON_MESSAGE(WM_DELETEALL,LoadTasks)
ON_BN_CLICKED(IDC_HELP, OnHelp)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CEditor2Dlg message handlers
BOOL CEditor2Dlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
wndMain = GetSafeHwnd();
LoadTasks();
CurSel = FileTitles[0];
::PostMessage(wndTask,WM_TABCHANGE,0,0);
return TRUE; // return TRUE unless you set the focus to a control
}
void CEditor2Dlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CEditor2Dlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CEditor2Dlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
void readstr(FILE *f,char *string)
{
do
{
fgets(string,255,f);
}while(string[0]=='/'||string[0]=='\n');
}
void CEditor2Dlg::OnNewtask()
{
AddType = "GLOBAL ADD";
CAddTask dlg;
dlg.DoModal();
CurSel = FileTitles[nCount-1];
::SendMessage(wndTask,WM_TABCHANGE,0,0);
}
CTaskPage *TaskPage=NULL;
CResultPage *ResultPage=NULL;
void CEditor2Dlg::LoadResults()
{
if (TaskPage) { TaskPage->DestroyWindow(); delete TaskPage; TaskPage=NULL;}
m_Tab.DeleteAllItems();
UINT i;
result = true;
CButton *bt = (CButton *)GetDlgItem(IDC_RESULT); bt->EnableWindow(FALSE);
bt = (CButton *)GetDlgItem(IDC_TASK); bt->EnableWindow(TRUE);
ResultPage = new CResultPage;
ResultPage->Create(CResultPage::IDD,&m_Tab);
ResultPage->SetWindowPos(NULL,2,30,0,0,SWP_NOSIZE | SWP_NOZORDER);
TC_ITEM item;
for (i=0; i<nCount; i++)
{
item.mask = TCIF_TEXT;
item.pszText = (LPSTR)(LPCSTR)FileTitles[i];
m_Tab.InsertItem(i,&item);
item.mask = TCIF_PARAM;
item.lParam = (LPARAM)ResultPage;
m_Tab.SetItem(i,&item);
if (i==nCount-1) ResultPage->ShowWindow(SW_NORMAL);
}
}
void CEditor2Dlg::LoadTasks()
{
UINT N=0;
if (ResultPage) { ResultPage->DestroyWindow(); delete ResultPage; ResultPage=NULL;}
m_Tab.DeleteAllItems();
UINT i,j;
nCount = 0;
result = false;
CButton *bt = (CButton *)GetDlgItem(IDC_TASK); bt->EnableWindow(FALSE);
bt = (CButton *)GetDlgItem(IDC_RESULT); bt->EnableWindow(TRUE);
CFileFind FileFind; FileFind.FindFile("*.tsk");
while (FileFind.FindNextFile())
{
FileNames[nCount] = FileFind.GetFileName();
FileTitles[nCount] = FileFind.GetFileTitle();
++nCount;
}
FileNames[nCount] = FileFind.GetFileName();
FileTitles[nCount] = FileFind.GetFileTitle();
CurSel = FileTitles[nCount];
++nCount;
if (!nCount) return;
// And now load from disk
char line[255],str[255];
for (i=0; i<nCount; i++)
{
FILE *file=NULL;
file = fopen(FileNames[i],"r");
readstr(file,line);
sscanf(line,"N %d\n",&N);
task[i] = new TASK[N];
task[i][0].N=N;
for (j=0; j<N; j++)
{
readstr(file,line); sscanf(line,"DATE %s\n",str);
task[i][j].Date = str;
readstr(file,line); sscanf(line,"TIME %s\n",str);
task[i][j].Time = str;
readstr(file,line); sscanf(line,"TIME2 %s\n",str);
task[i][j].TimeSpan = str;
readstr(file,line); sscanf(line,"COUNT %s\n",str);
task[i][j].nCount = str;
}
fclose(file);
}
// End load from disk
if (TaskPage==NULL)
{
TaskPage = new CTaskPage;
TaskPage->Create(CTaskPage::IDD,&m_Tab);
TaskPage->SetWindowPos(NULL,2,30,0,0,SWP_NOSIZE|SWP_NOZORDER);
}
TC_ITEM item;
for (i=0; i<nCount; i++)
{
item.mask = TCIF_TEXT;
item.pszText = (LPSTR)(LPCSTR)FileTitles[i];
m_Tab.InsertItem(i,&item);
item.mask = TCIF_PARAM;
item.lParam = (LPARAM)TaskPage;
m_Tab.SetItem(i,&item);
if (i==nCount-1) TaskPage->ShowWindow(SW_NORMAL);
}
}
void CEditor2Dlg::OnResult()
{
LoadResults();
}
void CEditor2Dlg::OnTask()
{
LoadTasks();
}
void CEditor2Dlg::OnSelchangeTab1(NMHDR* pNMHDR, LRESULT* pResult)
{
UINT Index;
TC_ITEM item;
char str[255];
Index = m_Tab.GetCurSel();
item.cchTextMax = 255;
item.mask = TCIF_TEXT;
item.pszText = str;
m_Tab.GetItem(Index,&item);
CurSel = str;
if (!result) ::SendMessage(wndTask,WM_TABCHANGE,0,0);
else ::SendMessage(wndResult,WM_TABCHANGE,0,0);
*pResult = 0;
}
void CEditor2Dlg::OnExit()
{
EndDialog(0);
}
void CEditor2Dlg::OnRclickTab1(NMHDR* pNMHDR, LRESULT* pResult)
{
UINT nID,i;
for (i=0; i<nCount; i++) if (CurSel==FileTitles[i]) { nID = i; break;}
CString OldName = FileNames[nID];
NewName=FileTitles[nID];
// Now Get New Name
CNewName dlg;
dlg.DoModal();
if (NewName.IsEmpty()) return;
/////////////////////
TC_ITEM item;
char str[255];
item.mask = TCIF_TEXT;
item.cchTextMax = 255;
item.pszText = str;
UINT nItem = m_Tab.GetCurSel();
m_Tab.GetItem(nItem,&item);
item.pszText = (LPSTR)(LPCSTR)NewName;
m_Tab.SetItem(nItem,&item);
FileNames[nID] = NewName+".tsk";
FileTitles[nID] = NewName;
Save();
if (OldName != FileNames[nID]) CFile::Remove(OldName);
LoadTasks();
*pResult = 0;
}
void CEditor2Dlg::OnAbout()
{
CAboutDlg dlg;
dlg.DoModal();
}
void CEditor2Dlg::OnHelp()
{
ShellExecute(NULL,NULL,"help.html",NULL,NULL,SW_SHOW);
}
NewName.cpp
// NewName.cpp : implementation file
//
#include "stdafx.h"
#include "Editor2.h"
#include "NewName.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CNewName dialog
CNewName::CNewName(CWnd* pParent /*=NULL*/)
: CDialog(CNewName::IDD, pParent)
{
//{{AFX_DATA_INIT(CNewName)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
}
void CNewName::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CNewName)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CNewName, CDialog)
//{{AFX_MSG_MAP(CNewName)
ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CNewName message handlers
void CNewName::OnButton1()
{
GetDlgItemText(IDC_NAME,NewName);
if (NewName.FindOneOf("/\\:*<>|'?")>=0)
{
NewName.Empty();
MessageBox(" íàçâ³ íå ïîâèííî áóòè òàêèõ çíàê³â /\\:*<>|'?","Ïîìèëêà",MB_OK|MB_ICONERROR);
return;
}
if (NewName.IsEmpty()) MessageBox("Ââåä³òü íîâå ³ì'ÿ","Ïîìèëêà",MB_OK|MB_ICONERROR);
else EndDialog(0);
}
BOOL CNewName::OnInitDialog()
{
CDialog::OnInitDialog();
SetDlgItemText(IDC_NAME,NewName);
NewName.Empty();
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
ResultPage.cpp
// ResultPage.cpp : implementation file
//
#include "stdafx.h"
#include "Editor2.h"
#include "ResultPage.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CResultPage dialog
CResultPage::CResultPage(CWnd* pParent /*=NULL*/)
: CDialog(CResultPage::IDD, pParent)
{
//{{AFX_DATA_INIT(CResultPage)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
}
void CResultPage::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CResultPage)
DDX_Control(pDX, IDC_LIST1, m_List);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CResultPage, CDialog)
//{{AFX_MSG_MAP(CResultPage)
ON_MESSAGE(WM_TABCHANGE,OnChange)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CResultPage message handlers
void readstr(FILE *f,char *string)
{
do
{
fgets(string,255,f);
}while(string[0]=='/'||string[0]=='\n');
}
BOOL CResultPage::OnInitDialog()
{
CDialog::OnInitDialog();
wndResult = GetSafeHwnd();
m_List.InsertColumn(0,_T("Äàòà"),LVCFMT_LEFT,100);
m_List.InsertColumn(1,_T("×àñ"),LVCFMT_LEFT,100);
m_List.InsertColumn(2,_T("Ê-ñòü ³ïìóëüñ³â"),LVCFMT_LEFT,100);
OnChange();
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CResultPage::OnChange()
{
CStatic *st = (CStatic *)GetDlgItem(IDC_ERROR);
st->ShowWindow(SW_HIDE);
m_List.DeleteAllItems();
LV_ITEM item; item.mask=LVIF_TEXT;
CString FileName = CurSel+".sol",str;
CFileFind FileFind;
if (!FileFind.FindFile(FileName))
{
st->ShowWindow(SW_SHOW);
return;
}
FILE *file;
file = fopen(FileName,"r");
char line[255];
readstr(file,line);
int N=0;
sscanf(line,"N %d\n",&N);
for (int i=0; i<N; i++)
{
item.iItem = i;
item.iSubItem = 0;
readstr(file,line);
sscanf(line,"DATE %s\n",str);
item.pszText = (LPSTR)(LPCSTR)str;
m_List.InsertItem(&item);
++item.iSubItem;
readstr(file,line);
sscanf(line,"TIME %s\n",str);
item.pszText = (LPSTR)(LPCSTR)str;
m_List.SetItem(&item);
++item.iSubItem;
readstr(file,line);
sscanf(line,"COUNT %s\n",str);
item.pszText = (LPSTR)(LPCSTR)str;
m_List.SetItem(&item);
}
fclose(file);
}
TaskPage.cpp
// TaskPage.cpp : implementation file
//
#include "stdafx.h"
#include "Editor2.h"
#include "TaskPage.h"
#include "AddTask.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CTaskPage dialog
TASK *task[7]={NULL};
CString FileNames[7];
CString FileTitles[7];
CString CurSel,Date,Time,TimeSpan,Count;
UINT nCount;
HWND wndTask,wndResult,wndMain;
CString AddType,NewName;
void Save()
{
UINT i,j;
CString str;
for (j=0; j<nCount; j++)
{
FILE *file;
file = fopen(FileNames[j],"w");
str.Format("N %d\n",task[j][0].N);
fputs(str,file);
for (i=0; i<task[j][0].N; i++)
{
str.Format("DATE %s\n",task[j][i].Date); fputs(str,file);
str.Format("TIME %s\n",task[j][i].Time); fputs(str,file);
str.Format("TIME2 %s\n",task[j][i].TimeSpan); fputs(str,file);
str.Format("COUNT %s\n",task[j][i].nCount); fputs(str,file);
}
fclose(file);
}
}
CTaskPage::CTaskPage(CWnd* pParent /*=NULL*/)
: CDialog(CTaskPage::IDD, pParent)
{
//{{AFX_DATA_INIT(CTaskPage)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
}
void CTaskPage::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CTaskPage)
DDX_Control(pDX, IDC_LIST1, m_List);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CTaskPage, CDialog)
//{{AFX_MSG_MAP(CTaskPage)
ON_BN_CLICKED(IDC_ADD, OnAdd)
ON_BN_CLICKED(IDC_SAVE, OnSave)
ON_BN_CLICKED(IDC_DELETE, OnDelete)
ON_BN_CLICKED(IDC_DELETEALL, OnDeleteall)
ON_MESSAGE(WM_TABCHANGE,OnChange)
ON_BN_CLICKED(IDC_EDIT, OnEdit)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CTaskPage message handlers
BOOL CTaskPage::OnInitDialog()
{
CDialog::OnInitDialog();
wndTask = GetSafeHwnd();
m_List.InsertColumn(0,_T("Äàòà"),LVCFMT_LEFT,100);
m_List.InsertColumn(1,_T("×àñ"),LVCFMT_LEFT,100);
m_List.InsertColumn(2,_T("×àñ âèì³ðþâàííÿ"),LVCFMT_LEFT,100);
m_List.InsertColumn(3,_T("Ê-ñòü âèì³ðþâàííÿ"),LVCFMT_LEFT,100);
LoadFromID(true);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CTaskPage::LoadFromID(bool b)
{
UINT i;
CString CurrentFile;
UINT nID;
if (b) nID = 0;
else
{
for (i=0; i<nCount; i++) if (CurSel==FileTitles[i]) { nID = i; break;}
}
m_List.DeleteAllItems();
LV_ITEM item;
item.mask=LVIF_TEXT;
for (i=0; i<task[nID][0].N; i++)
{
item.iItem=i;
item.iSubItem=0;
item.pszText = (LPSTR)(LPCSTR)task[nID][i].Date;
m_List.InsertItem(&item);
item.iSubItem=1;
item.pszText = (LPSTR)(LPCSTR)task[nID][i].Time;
m_List.SetItem(&item);
item.iSubItem=2;
item.pszText = (LPSTR)(LPCSTR)task[nID][i].TimeSpan;
m_List.SetItem(&item);
item.iSubItem=3;
item.pszText = (LPSTR)(LPCSTR)task[nID][i].nCount;
m_List.SetItem(&item);
}
}
void CTaskPage::OnAdd()
{
AddType = "ADD";
CAddTask dlg;
dlg.DoModal();
LoadFromID();
Save();
}
void CTaskPage::OnChange()
{
static short Q=0;
if (Q) Save();
if (!Q) ++Q;
LoadFromID();
}
void CTaskPage::OnSave()
{
Save();
}
void CTaskPage::OnDelete()
{
CString str;
UINT i,nID;
if (!m_List.GetSelectedCount()) { MessageBox("Ñïî÷àòêó âèáåð³òü ïóíêò âèäàëåííÿ","Ïîìèëêà",MB_OK|MB_ICONERROR); return; }
if (MessageBox("Âè âïåâíåí³?","Ïèòàííÿ",MB_ICONEXCLAMATION|MB_YESNO)!=IDYES) return;
for (i=0; i<nCount; i++) if (CurSel==FileTitles[i]) { nID = i; break;}
UINT nItem = m_List.GetSelectionMark();
Date = m_List.GetItemText(nItem,0);
Time = m_List.GetItemText(nItem,1);
TimeSpan = m_List.GetItemText(nItem,2);
Count = m_List.GetItemText(nItem,3);
m_List.DeleteItem(nItem);
for (i=0; i<task[nID][0].N; i++)
{
if (Date==task[nID][i].Date&&Time==task[nID][i].Time&&TimeSpan==task[nID][i].TimeSpan&&Count==task[nID][i].nCount)
{
if (!i) task[nID][1].N=task[nID][0].N;
for (UINT j=i; j<task[nID][0].N-1; j++)
{
task[nID][j].Date = task[nID][j+1].Date;
task[nID][j].Time = task[nID][j+1].Time;
task[nID][j].TimeSpan = task[nID][j+1].TimeSpan;
task[nID][j].nCount = task[nID][j+1].nCount;
}
--task[nID][0].N;
}
}
Save();
if (task[nID][0].N<=0)
{
CFile ::Remove(FileNames[nID]);
FileNames[nID].Empty();
FileTitles[nID].Empty();
::SendMessage(wndMain,WM_DELETEALL,0,0);
}
}
void CTaskPage::OnDeleteall()
{
UINT nID,i;
for (i=0; i<nCount; i++) if (CurSel==FileTitles[i]) { nID = i; break;}
if (MessageBox("Âè âïåâíåí³?","Ïèòàííÿ",MB_YESNO|MB_ICONWARNING)!=IDYES) return;
m_List.DeleteAllItems();
task[nID] = NULL;
CFile::Remove(FileNames[nID]);
FileNames[nID].Empty();
FileTitles[nID].Empty();
--nCount;
::SendMessage(wndMain,WM_DELETEALL,0,0);
Save();
LoadFromID();
}
void CTaskPage::OnEdit()
{
if (m_List.GetSelectedCount()==0) {MessageBox("Ñïî÷àòêó âèáåð³òü ïóíêò äëÿ ðåäàãóâàííÿ","Ïîìèëêà",MB_OK|MB_ICONERROR); return; }
AddType = "EDIT";
UINT nItem = m_List.GetSelectionMark();
Date = m_List.GetItemText(nItem,0);
Time = m_List.GetItemText(nItem,1);
TimeSpan = m_List.GetItemText(nItem,2);
Count = m_List.GetItemText(nItem,3);
CAddTask dlg;
dlg.DoModal();
Save();
LoadFromID();
}
Контролер LPT порту
DOS версія
LPT_CONTR.cpp
#include <fstream.h>
#include <iostream.h>
#include <dos.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
typedef unsigned short BOOL;
typedef BOOL WORD;
struct DATA
{
DATA() { started = 0; result = 0; ZeroResult= 0; hour2=0; min2=0; done =0;}
struct date d;
struct time t;
int count,hour2,min2;
BOOL started,done;
unsigned long result,ZeroResult;
DATA *next;
};
DATA *p[7];
int N[7];
BOOL ZeroRun = 0;
WORD lpt1_addr;
char counter = 0;
void GetAddr()
{
asm{
push ax
push dx
push es
mov ax, 40h
mov es, ax
mov dx, es:[08]
mov lpt1_addr, dx
add dx,2
mov al,0
out dx,al
sub dx,2
out dx,al
pop es
pop dx
pop ax
}
}
void StartCounter(int num)
{
char ou;
switch(num)
{
case 0: ou=2; break;
case 1: ou=8; break;
case 2: ou=32; break;
case 3: ou=128; break;
}
for (int i=0; i<20; i++)
asm{
push ax
push dx
mov dx,lpt1_addr
mov al, ou
out dx, al
out dx, al
pop dx
pop ax
}
cout << "STARTED TASK...\n" << num << endl;
}
void StopCounter(int num)
{
char c2;
char val;
switch(num)
{
case 0: c2=2; break;
case 1: c2=8; break;
case 2: c2=32; break;
case 3: c2=128; break;
}
asm{
push ax
push dx
mov dx,lpt1_addr
in al,dx
mov val,al
mov al,c2
sub val,al
mov al,val
out dx,al
out dx,al
pop dx
pop ax
}
}
int ReceiveData(int num)
{
char received;
char in;
switch(num)
{
case 0: in = 1; break;
case 1: in = 4; break;
case 2: in = 16; break;
case 3: in = 64; break;
}
asm{
push ax
push dx
mov dx,lpt1_addr
in al,dx
mov received,al
pop dx
pop ax
}
if (received - in>=0) return 1;
else return 0;
}
void SaveResults(int file)
{
int mins,final;
char filename[20] = "count";
char ch[2] = {'\0'};
itoa(file,ch,10);
strcat(filename,ch); strcat(filename,".sol");
ofstream ofs(filename);
int completed = 0;
for (int i=0; i<N[file]; i++) if (p[file][i].done == 1) ++completed;
ofs << "N " << completed << endl;
for (i=0; i<N[file]; i++)
{
if (p[file][i].done == 1)
{
mins = p[file][i].hour2*60+p[file][i].min2;
final = (p[file][i].result - p[file][i].ZeroResult)/mins;
ofs << "DATE " << (int)p[file][i].d.da_day << "." << (int)p[file][i].d.da_mon << "." << (int)p[file][i].d.da_year << endl;
ofs << "TIME " << (int)p[file][i].t.ti_hour << ":" << (int)p[file][i].t.ti_min << endl;
ofs << "COUNT " << final << endl;
}
}
ofs.close();
}
void AssignStruct(int& day,int& mon, int& year, int& hour, int& min, int& time2, int& count, int index,int f)
{
p[f][index].d.da_year = year;
p[f][index].d.da_day = day;
p[f][index].d.da_mon = mon;
p[f][index].t.ti_hour = hour;
p[f][index].t.ti_min = min;
p[f][index].t.ti_sec = 0;
time2*=count;
p[f][index].count = count;
p[f][index].hour2 = hour;
while (time2-60>0) { ++p[f][index].hour2; time2-=60; }
if (time2+min>59) { ++p[f][index].hour2; time2-=60; }
p[f][index].min2=time2+min;
}
int main()
{
GetAddr();
clrscr();
char filename[]="Count1.tsk\0",fileI[2];
int i;
char ch[2],line[255]; ch[1]='\0';
int day,mon,year,hour,min,time2,count;
ifstream ifs;
for (int CurFile=1; CurFile<=3; CurFile++)
{
strcpy(filename,"Count"); itoa(CurFile,fileI,10);
strcat(filename,fileI); strcat(filename,".tsk");
ifs.open(filename);
if (!ifs.rdbuf()->is_open()) { p[CurFile]=NULL; goto end; }
ch[0] = '\0';
while (ch[0]!='\n') ifs.read(ch,1);
ifs >> line; ifs >> N[CurFile];
p[CurFile] = new DATA[N[CurFile]];
for (i=0; i<N[CurFile]; i++)
{
ifs >> line; ifs >> line;
sscanf(line,"%d.%d.%d",&day,&mon,&year);
ifs >> line; ifs >> line;
sscanf(line,"%d:%d",&hour,&min);
ifs >> line; ifs >> time2;
ifs >> line; ifs >> count;
AssignStruct(day,mon,year,hour,min,time2,count,i,CurFile);
}
ifs.close();
end:;
}
unsigned short DONE = 0;
struct date CurDate;
struct time CurTime;
while(!DONE)
{
getdate(&CurDate);
gettime(&CurTime);
DONE = 1;
for (CurFile =1; CurFile<=7; CurFile++)
{
for (i=0; i<N[CurFile]; i++)
{
if (CurDate.da_year<p[CurFile][i].d.da_year
||(CurDate.da_year==p[CurFile][i].d.da_year
&&CurDate.da_mon<p[CurFile][i].d.da_mon)
||(CurDate.da_year==p[CurFile][i].d.da_year
&&CurDate.da_mon==p[CurFile][i].d.da_mon
&&CurDate.da_day<p[CurFile][i].d.da_day)
||(CurDate.da_year==p[CurFile][i].d.da_year
&&CurDate.da_mon==p[CurFile][i].d.da_mon
&&CurDate.da_day==p[CurFile][i].d.da_day
&&CurTime.ti_hour<p[CurFile][i].t.ti_hour)
||(CurDate.da_year==p[CurFile][i].d.da_year
&&CurDate.da_mon==p[CurFile][i].d.da_mon
&&CurDate.da_day==p[CurFile][i].d.da_day
&&CurTime.ti_hour==p[CurFile][i].t.ti_hour
&&CurTime.ti_min==p[CurFile][i].t.ti_min))
{
p[CurFile][i].done = 1;
p[CurFile][i].result = -1;
p[CurFile][i].count = 1;
p[CurFile][i].hour2 = 0; p[CurFile][i].min2 = 1;
}
if (CurDate.da_year==p[CurFile][i].d.da_year
&&CurDate.da_mon==p[CurFile][i].d.da_mon
&&CurDate.da_day==p[CurFile][i].d.da_day
&&CurTime.ti_hour==p[CurFile][i].t.ti_hour
&&CurTime.ti_min==p[CurFile][i].t.ti_min
&&!p[CurFile][i].started&&!p[CurFile][i].done)
{
DONE = 0;
if (ZeroRun==0) { StartCounter(0); ZeroRun = 1; }
StartCounter(CurFile);
p[CurFile][i].started = 1;
}
if (p[CurFile][i].started == 1
&&CurTime.ti_hour>=p[CurFile][i].hour2
||(CurTime.ti_hour==p[CurFile][i].hour2
&&CurTime.ti_min>=p[CurFile][i].min2))
{
p[CurFile][i].started = 0;
p[CurFile][i].done = 1;
StopCounter(CurFile);
SaveResults(CurFile);
}
if (p[CurFile][i].started)
{
DONE = 0;
p[CurFile][i].ZeroResult += ReceiveData(0);
p[CurFile][i].result += ReceiveData(CurFile);
}
}
}
delay(10);
}
return 0;
}
Контролер LPT порту
Windows версія
Resource.h
// Microsoft Visual C++ generated include file.
// Used by LPT_VC.RC
//
#define IDR_MAINFRAME 128
#define IDD_LPT_VC_DIALOG 102
#define IDD_ABOUTBOX