4-Opisanie_Programmy_final (1061499), страница 3
Текст из файла (страница 3)
}
}
private void DisconnectionState()
{
_manager.LinkActive = false;
_countDownLinkTry = 3;
_countTry = 3;
_countTryActiveLink = 3*_ports.Count;
_ackActivelinkTimer.Stop();
_ackDownlinkTimer.Stop();
_ackUplinkTimer.Stop();
}
private void открытьИсториюToolStripMenuItem_Click(object sender, EventArgs e)
{
FileDialog.Filter = "Тесктовые файлы (*.txt)|*.txt";
FileDialog.InitialDirectory = Application.StartupPath;
FileDialog.ShowDialog();
}
private void Form1_Load(object sender, EventArgs e)
{
_allUsers.Add("Сергей");
_allUsers.Add("Валерия");
_allUsers.Add("Надежда");
_userForm.FormClosed += f_FormClosed;
do
{
_userForm.ShowDialog();
_settingsForm.currentUser = CurrentUser;
_settingsForm.ShowDialog();
if (!_settingsForm.portIsFree)
{
CurrenetUserLabel.Text = "Текущий пользователь: ";
_userForm.portIsntFreeLabel.Visible = true;
}
}
while (!_settingsForm.portIsFree);
_portsDict = _settingsForm.userPorts;
_ports.Clear();
_ports.AddRange(_portsDict.Values);
DisconectionButton.Enabled = false;
SendTextButton.Enabled = false;
textBox1.Enabled = false;
WideSpreadCheckBox.Enabled = false;
UsersBox.Enabled = false;
UsersBox.DataSource = _allUsers;
foreach (var port in _ports)
port.DataReceived += comPort_DataReceived;
_ackUplinkTimer.Tick += AckUplinkTimerTick;
_ackUplinkTimer.Interval = 10000;
_ackDownlinkTimer.Tick += AckDownlinkTimerTick;
_ackDownlinkTimer.Interval = 10000;
_ackActivelinkTimer.Tick += AckActivelinkTimerTick;
_ackActivelinkTimer.Interval = 1000000;
_ackUplinkTimer1.Tick += AckUplinkTimerTick1;
_ackUplinkTimer1.Interval = 10000;
_ackDownlinkTimer1.Tick += AckDownlinkTimerTick1;
_ackDownlinkTimer1.Interval = 10000;
}
private void f_FormClosed(object sender, EventArgs e)
{
CurrentUser = _userForm.CurrentUser;
_manager.CurrentUser = CurrentUser;
_manager.TextBox1 = richTextBox1;
_manager.TextBox2 = richTextBox2;
_manager.Users = _allUsers;
CurrenetUserLabel.Text += CurrentUser;
}
private void справкаToolStripMenuItem_Click(object sender, EventArgs e)
{
var form = new InfoForm();
form.Show();
}
private void ConnectionButton_Click(object sender, EventArgs e)
{
_countDownLinkTry = 3;
_countTry = 3;
_countTryActiveLink = 3*_ports.Count;
_manager.WriteData(textBox1.Text, ConectionManager.FrameType.UPLINK, false, _ports[0]);
_ackUplinkTimer.Start();
}
private void DisconectionButton_Click(object sender, EventArgs e)
{
DisconectionButton.Enabled = false;
_ackActivelinkTimer.Stop();
_countDownLinkTry = 3;
_countTry = 3;
_countTryActiveLink = 3*_ports.Count;
_manager.WriteData(textBox1.Text, ConectionManager.FrameType.DOWNLINK, false, _ports[0]);
_ackDownlinkTimer.Start();
}
private void comPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
foreach (var comPort in _ports)
{
Thread.Sleep(1000);
if (comPort.BytesToRead == 0) continue;
switch (comPort.ReadByte())
{
case START:
{
Thread.Sleep(1000);
Thread.Sleep((comPort.BytesToRead/200)*1000);
_manager.FrameAnalysis((byte) comPort.ReadByte(), comPort);
}
break;
default:
_manager.WriteData(null, ConectionManager.FrameType.RET, true, comPort);
break;
}
}
}
private void SendTextButton_Click(object sender, EventArgs e)
{
IEnumerable users;
if (WideSpreadCheckBox.Checked)
users = UsersBox.Items;
else
users = UsersBox.SelectedItems;
var selectedUsers = new List<string>();
foreach (string user in users)
if (user != CurrentUser)
selectedUsers.Add((string)user);
foreach (var selectedUser in selectedUsers)
{
var dataText = "[ " + DateTime.Now + " ]";
var messageText = CurrentUser + ": " + textBox1.Text;
var path = Application.StartupPath + @"\" + CurrentUser + "_" + selectedUser + ".txt";
var wstream =
new StreamWriter(path, true, Encoding.Default);
wstream.WriteLine(dataText);
wstream.WriteLine(messageText);
wstream.Close();
}
var usersToSend = new List<SerialPort>();
foreach (var selectedUser in selectedUsers)
{
SerialPort port;
_portsDict.TryGetValue(selectedUser, out port);
usersToSend.Add(port);
}
var alreadyDisplayed = false;
foreach (var comPort in usersToSend)
{
if (textBox1.Text == "") continue;
_manager.WriteData(CurrentUser.Length + CurrentUser + ": " + textBox1.Text + " ",
ConectionManager.FrameType.DAT, alreadyDisplayed, comPort);
if (!alreadyDisplayed)
alreadyDisplayed = true;
textBox1.Select();
}
textBox1.Clear();
}
private void FileDialog_FileOk(object sender, System.ComponentModel.CancelEventArgs e)
{
var hForm = new HistoryForm {Filepath = FileDialog.FileName};
if (FileDialog.SafeFileName != null)
hForm.Text = "История ( " + FileDialog.SafeFileName.Replace(".txt", "") + " )";
hForm.Show();
}
}
}
ConectionManager.cs (Менеджер соединения)
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.IO.Ports;
using System.Text;
using System.Windows.Forms;
namespace ST_Kurs_Chat
{
internal class ConectionManager
{
public enum FrameType : byte
{
UPLINK, //кадр установки соединения
ACK_UPLINK,
ACK,
ACK_DOWNLINK,
ACK_LINKACTIVE, //кадры -квитанция
RET_UPLINK,
RET_DOWNLINK,
RET_LINKACITVE,
RET_DAT,
RET, //кадры - ARQ
DOWNLINK, //кадр разрыва соединения
LINKACTIVE,
DAT,
SUNH, //Кадр синхронизации пользователей
ACK_SUNH
}
public enum MessageType
{
Incoming,
Outgoing,
Normal,
Warning,
Error
};
private const byte Start = 0xFF;
public string CurrentUser;
public string HistoryFileName = "History.txt";
public bool LinkActive;
public RichTextBox TextBox1;
public RichTextBox TextBox2;
public List<string> Users;
private readonly Heming _coder = new Heming();
private readonly Color[] _messageColor = {Color.Blue, Color.Green, Color.Black, Color.Orange, Color.Red};
public Dictionary<string, bool> linkActiveDictionary = new Dictionary<string, bool>();
private byte previousOperation;
private string lastMsg = string.Empty;
private int reSendCount = 3;
public void FrameAnalysis(byte mybyte, SerialPort comPort)
{
previousOperation = mybyte;
switch (mybyte)
{
case (byte) FrameType.UPLINK:
DisplayData(MessageType.Incoming, DateTime.Now + " UPLINK \n", false);
WriteData(null, FrameType.ACK_UPLINK, false, comPort);
break;
case (byte) FrameType.DOWNLINK:
DisplayData(MessageType.Incoming, DateTime.Now + " DOWNLINK \n", false);
WriteData(null, FrameType.ACK_DOWNLINK, false, comPort);
break;
case (byte) FrameType.ACK:
reSendCount = 3;
DisplayData(MessageType.Incoming, DateTime.Now + " ACK \n", false);
break;
case (byte) FrameType.ACK_DOWNLINK:
if (linkActiveDictionary.ContainsKey(comPort.PortName))
linkActiveDictionary.Remove(comPort.PortName);
linkActiveDictionary.Add(comPort.PortName, false);
DisplayData(MessageType.Incoming, DateTime.Now + " ACK_DOWNLINK \n", false);
break;
case (byte) FrameType.ACK_LINKACTIVE:
DisplayData(MessageType.Incoming, DateTime.Now + " ACK_LINKACTIVE \n", false);
break;
case (byte) FrameType.ACK_UPLINK:
if (linkActiveDictionary.ContainsKey(comPort.PortName))
linkActiveDictionary.Remove(comPort.PortName);
linkActiveDictionary.Add(comPort.PortName, true);
DisplayData(MessageType.Incoming, DateTime.Now + " ACK_UPLINK \n", false);
break;
case (byte) FrameType.RET:
if (previousOperation != (byte)FrameType.DAT)
FrameAnalysis(previousOperation, comPort);
DisplayData(MessageType.Incoming, DateTime.Now + " RET \n", false);
break;
case (byte) FrameType.RET_DOWNLINK:
if (linkActiveDictionary.ContainsKey(comPort.PortName))
linkActiveDictionary.Remove(comPort.PortName);
linkActiveDictionary.Add(comPort.PortName, false);
DisplayData(MessageType.Incoming, DateTime.Now + " RET_DOWNLINK \n", false);
WriteData(null, FrameType.DOWNLINK, false, comPort);
break;
case (byte) FrameType.RET_LINKACITVE:
if (linkActiveDictionary.ContainsKey(comPort.PortName))
linkActiveDictionary.Remove(comPort.PortName);
linkActiveDictionary.Add(comPort.PortName, false);
DisplayData(MessageType.Incoming, DateTime.Now + " RET_LINKACITVE \n", false);
WriteData(null, FrameType.LINKACTIVE, false, comPort);
break;
case (byte) FrameType.RET_UPLINK:
if (linkActiveDictionary.ContainsKey(comPort.PortName))
linkActiveDictionary.Remove(comPort.PortName);
linkActiveDictionary.Add(comPort.PortName, false);
DisplayData(MessageType.Incoming, DateTime.Now + " RET_UPLINK \n", false);
WriteData(null, FrameType.UPLINK, false, comPort);
break;
case (byte) FrameType.LINKACTIVE:
if (linkActiveDictionary.ContainsKey(comPort.PortName))
linkActiveDictionary.Remove(comPort.PortName);
linkActiveDictionary.Add(comPort.PortName, false);
DisplayData(MessageType.Incoming, DateTime.Now + " LINKACTIVE \n", false);
WriteData(null, FrameType.ACK_LINKACTIVE, false, comPort);
break;
case (byte)FrameType.RET_DAT:
DisplayData(MessageType.Incoming, DateTime.Now + " RET \n", false);
if (reSendCount > 0)
{
reSendCount--;
WriteData(lastMsg, FrameType.DAT, false, comPort);
}
else
{
reSendCount = 3;
}
break;
case (byte) FrameType.DAT:
DisplayData(MessageType.Incoming, DateTime.Now + " DAT \n", false);
var bytesCount = comPort.BytesToRead;
var text = new byte[bytesCount];
comPort.Read(text, 0, bytesCount);
var decoded = _coder.DeCodeString(text);
if (decoded == "") WriteData(null, FrameType.RET_DAT, false, comPort);
else
{
var senUserLength = CharToInt(decoded.Substring(0, 1)[0]);
var sendUser = decoded.Substring(1, senUserLength);
var dataText = "[ " + DateTime.Now + " ]";
var message = decoded.Substring(1);
var path = Application.StartupPath + @"\" + CurrentUser + "_" + sendUser + ".txt";
var wstream =
new StreamWriter(path, true, Encoding.Default);
wstream.WriteLine(dataText);
wstream.WriteLine(message);
wstream.Close();
WriteData(null, FrameType.ACK, false, comPort);
DisplayData(MessageType.Incoming, "\n[ " + DateTime.Now + " ]\n" + message + "\n", true);
}
break;
default:
DisplayData(MessageType.Normal, DateTime.Now + " unknow frame \n", false);
break;
}
}
private static int CharToInt(char c)
{
return c - '0';
}
[STAThread]
private void DisplayData(MessageType type, string msg, bool isMsg)
{
if (isMsg)
TextBox1.Invoke(new EventHandler(delegate
{
TextBox1.SelectedText = string.Empty;
TextBox1.SelectionFont = new Font(TextBox1.SelectionFont, FontStyle.Bold);
















