jungervin 8 лет назад
Родитель
Сommit
832179bf1b

+ 31 - 6
EsPy/Components/Terminal.cs

@@ -315,6 +315,28 @@ namespace EsPy.Components
             base.WndProc(ref m);
         }
 
+        private void Paste(string text)
+        {
+            //this.InsertText(this.CurrentPosition, text);
+            //this.GotoPosition(this.CurrentPosition + text.Length);
+            //return;
+
+            //Line line = this.Lines[this.CurrentLine];
+            //string  = this.GetTextRange(this.PromptPos, this.TextLength - this.PromptPos);
+
+            string[] lines = text.Replace("\r", "").Split('\n');
+            //foreach (string line in lines)
+            //{
+            //    this.Port.WriteLine(line);
+            //}
+
+            for (int i = 0; i < lines.Length - 1; i++)
+            {
+                this.Port.WriteLine(lines[i]);
+            }
+
+            this.Port.Write(lines[lines.Length - 1]);
+        }
         protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
         {
             Line line = null;
@@ -344,12 +366,15 @@ namespace EsPy.Components
                         case Keys.Control | Keys.V:
                             if (Clipboard.ContainsText())
                             {
-                                this.Port.Clean();
-                                this.Port.PasteMode();
-                                this.Port.ReadAllLines();
-                                byte[] buff = Encoding.UTF8.GetBytes(Clipboard.GetText().Replace("\r", ""));
-                                this.Port.Write(buff, 0, buff.Length);
-                                this.Port.SoftReset();
+                                this.Paste(Clipboard.GetText());
+                                //this.Port.Clean();
+                                //this.Port.PasteMode();
+                                //this.Port.ReadAllLines();
+                                //byte[] buff = Encoding.UTF8.GetBytes(Clipboard.GetText().Replace("\r", ""));
+                                //this.Port.Write(buff, 0, buff.Length);
+                                //this.Port.SoftReset();
+
+                                 
 
                             }
                             return true;

+ 97 - 11
EsPy/Dialogs/PyFileManager.Designer.cs

@@ -49,13 +49,20 @@
             this.btnDelete = new System.Windows.Forms.Button();
             this.btnMkDir = new System.Windows.Forms.Button();
             this.btnRename = new System.Windows.Forms.Button();
+            this.label2 = new System.Windows.Forms.Label();
+            this.labTotal = new System.Windows.Forms.Label();
+            this.label3 = new System.Windows.Forms.Label();
+            this.lFree = new System.Windows.Forms.Label();
+            this.label5 = new System.Windows.Forms.Label();
+            this.lUsage = new System.Windows.Forms.Label();
+            this.label4 = new System.Windows.Forms.Label();
             this.contextMenuStrip1.SuspendLayout();
             this.SuspendLayout();
             // 
             // label1
             // 
             this.label1.AutoSize = true;
-            this.label1.Location = new System.Drawing.Point(12, 9);
+            this.label1.Location = new System.Drawing.Point(9, 9);
             this.label1.Name = "label1";
             this.label1.Size = new System.Drawing.Size(32, 13);
             this.label1.TabIndex = 0;
@@ -68,10 +75,12 @@
             this.columnHeader2});
             this.listView1.ContextMenuStrip = this.contextMenuStrip1;
             this.listView1.FullRowSelect = true;
+            this.listView1.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable;
             this.listView1.HideSelection = false;
-            this.listView1.Location = new System.Drawing.Point(12, 25);
+            this.listView1.Location = new System.Drawing.Point(10, 25);
+            this.listView1.MultiSelect = false;
             this.listView1.Name = "listView1";
-            this.listView1.Size = new System.Drawing.Size(564, 230);
+            this.listView1.Size = new System.Drawing.Size(564, 228);
             this.listView1.SmallImageList = this.imageList1;
             this.listView1.TabIndex = 0;
             this.listView1.UseCompatibleStateImageBehavior = false;
@@ -146,7 +155,7 @@
             // 
             // btnUpload
             // 
-            this.btnUpload.Location = new System.Drawing.Point(392, 261);
+            this.btnUpload.Location = new System.Drawing.Point(392, 288);
             this.btnUpload.Name = "btnUpload";
             this.btnUpload.Size = new System.Drawing.Size(89, 23);
             this.btnUpload.TabIndex = 5;
@@ -157,7 +166,7 @@
             // btnClose
             // 
             this.btnClose.DialogResult = System.Windows.Forms.DialogResult.OK;
-            this.btnClose.Location = new System.Drawing.Point(487, 261);
+            this.btnClose.Location = new System.Drawing.Point(487, 288);
             this.btnClose.Name = "btnClose";
             this.btnClose.Size = new System.Drawing.Size(89, 23);
             this.btnClose.TabIndex = 6;
@@ -166,7 +175,7 @@
             // 
             // btnDownload
             // 
-            this.btnDownload.Location = new System.Drawing.Point(297, 261);
+            this.btnDownload.Location = new System.Drawing.Point(297, 288);
             this.btnDownload.Name = "btnDownload";
             this.btnDownload.Size = new System.Drawing.Size(89, 22);
             this.btnDownload.TabIndex = 4;
@@ -177,7 +186,7 @@
             // Path
             // 
             this.Path.AutoSize = true;
-            this.Path.Location = new System.Drawing.Point(53, 9);
+            this.Path.Location = new System.Drawing.Point(47, 9);
             this.Path.Name = "Path";
             this.Path.Size = new System.Drawing.Size(10, 13);
             this.Path.TabIndex = 0;
@@ -185,7 +194,7 @@
             // 
             // btnDelete
             // 
-            this.btnDelete.Location = new System.Drawing.Point(202, 261);
+            this.btnDelete.Location = new System.Drawing.Point(202, 288);
             this.btnDelete.Name = "btnDelete";
             this.btnDelete.Size = new System.Drawing.Size(89, 22);
             this.btnDelete.TabIndex = 3;
@@ -195,7 +204,7 @@
             // 
             // btnMkDir
             // 
-            this.btnMkDir.Location = new System.Drawing.Point(107, 261);
+            this.btnMkDir.Location = new System.Drawing.Point(107, 288);
             this.btnMkDir.Name = "btnMkDir";
             this.btnMkDir.Size = new System.Drawing.Size(89, 23);
             this.btnMkDir.TabIndex = 2;
@@ -205,7 +214,7 @@
             // 
             // btnRename
             // 
-            this.btnRename.Location = new System.Drawing.Point(12, 261);
+            this.btnRename.Location = new System.Drawing.Point(12, 288);
             this.btnRename.Name = "btnRename";
             this.btnRename.Size = new System.Drawing.Size(89, 23);
             this.btnRename.TabIndex = 1;
@@ -213,11 +222,81 @@
             this.btnRename.UseVisualStyleBackColor = true;
             this.btnRename.Click += new System.EventHandler(this.btnRename_Click);
             // 
+            // label2
+            // 
+            this.label2.AutoSize = true;
+            this.label2.Location = new System.Drawing.Point(12, 260);
+            this.label2.Name = "label2";
+            this.label2.Size = new System.Drawing.Size(37, 13);
+            this.label2.TabIndex = 7;
+            this.label2.Text = "Total: ";
+            // 
+            // labTotal
+            // 
+            this.labTotal.AutoSize = true;
+            this.labTotal.Location = new System.Drawing.Point(56, 260);
+            this.labTotal.Name = "labTotal";
+            this.labTotal.Size = new System.Drawing.Size(16, 13);
+            this.labTotal.TabIndex = 8;
+            this.labTotal.Text = "---";
+            // 
+            // label3
+            // 
+            this.label3.AutoSize = true;
+            this.label3.Location = new System.Drawing.Point(130, 260);
+            this.label3.Name = "label3";
+            this.label3.Size = new System.Drawing.Size(34, 13);
+            this.label3.TabIndex = 7;
+            this.label3.Text = "Free: ";
+            // 
+            // lFree
+            // 
+            this.lFree.AutoSize = true;
+            this.lFree.Location = new System.Drawing.Point(170, 260);
+            this.lFree.Name = "lFree";
+            this.lFree.Size = new System.Drawing.Size(16, 13);
+            this.lFree.TabIndex = 8;
+            this.lFree.Text = "---";
+            // 
+            // label5
+            // 
+            this.label5.AutoSize = true;
+            this.label5.Location = new System.Drawing.Point(236, 260);
+            this.label5.Name = "label5";
+            this.label5.Size = new System.Drawing.Size(44, 13);
+            this.label5.TabIndex = 7;
+            this.label5.Text = "Usage: ";
+            // 
+            // lUsage
+            // 
+            this.lUsage.AutoSize = true;
+            this.lUsage.Location = new System.Drawing.Point(286, 260);
+            this.lUsage.Name = "lUsage";
+            this.lUsage.Size = new System.Drawing.Size(16, 13);
+            this.lUsage.TabIndex = 8;
+            this.lUsage.Text = "---";
+            // 
+            // label4
+            // 
+            this.label4.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
+            this.label4.Location = new System.Drawing.Point(12, 280);
+            this.label4.Name = "label4";
+            this.label4.Size = new System.Drawing.Size(562, 2);
+            this.label4.TabIndex = 9;
+            this.label4.Text = "label4";
+            // 
             // PyFileManager
             // 
             this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
             this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
-            this.ClientSize = new System.Drawing.Size(587, 293);
+            this.ClientSize = new System.Drawing.Size(587, 323);
+            this.Controls.Add(this.label4);
+            this.Controls.Add(this.lUsage);
+            this.Controls.Add(this.lFree);
+            this.Controls.Add(this.labTotal);
+            this.Controls.Add(this.label5);
+            this.Controls.Add(this.label3);
+            this.Controls.Add(this.label2);
             this.Controls.Add(this.btnClose);
             this.Controls.Add(this.btnRename);
             this.Controls.Add(this.btnMkDir);
@@ -261,5 +340,12 @@
         private System.Windows.Forms.Button btnDelete;
         private System.Windows.Forms.Button btnMkDir;
         private System.Windows.Forms.Button btnRename;
+        private System.Windows.Forms.Label label2;
+        private System.Windows.Forms.Label labTotal;
+        private System.Windows.Forms.Label label3;
+        private System.Windows.Forms.Label lFree;
+        private System.Windows.Forms.Label label5;
+        private System.Windows.Forms.Label lUsage;
+        private System.Windows.Forms.Label label4;
     }
 }

+ 15 - 1
EsPy/Dialogs/PyFileManager.cs

@@ -47,6 +47,21 @@ namespace EsPy.Dialogs
                     return;
                 }
 
+                ResultStatus df = this.Port.StatVfs();
+                if (df.Result == ResultStatus.Statuses.Success && df.Data is StatVfs)
+                {
+                    StatVfs fs = df.Data as StatVfs;
+                    this.labTotal.Text = fs.TotalMegaBytes.ToString("0.00 MB");
+                    this.lFree.Text = fs.FreeMegaBytes.ToString("0.00 MB");
+                    this.lUsage.Text = fs.Usage.ToString("0.00 %");
+                }
+                else
+                {
+                    this.labTotal.Text = 
+                        this.lFree.Text = 
+                        this.lUsage.Text = "NaN";
+                }
+
                 ResultStatus files = this.Port.Ls();
 
                 if (files.Result == ResultStatus.Statuses.Success)
@@ -57,7 +72,6 @@ namespace EsPy.Dialogs
                         item.SubItems.Add("");
                         item.ImageIndex = 0;
                         listView1.Items.Add(item);
-
                     }
 
 

+ 68 - 69
EsPy/Dialogs/PyFileManager.resx

@@ -127,76 +127,75 @@
     <value>
         AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
         LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
-        ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAADu
-        DwAAAk1TRnQBSQFMAgEBBAEAATABAAEwAQABEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA
+        ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAADo
+        DwAAAk1TRnQBSQFMAgEBBAEAATgBAAE4AQABEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA
         AwABIAMAAQEBAAEgBgABIP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8AYgADBwEJAxABFgMT
-        ARoDEwEaAxMBGgMTARoDEwEaAxMBGgMTARoDEwEaAxMBGgMTARoDEwEaAxMBGgMQARYDBwEJAVgCWwG8
-        AWIBkQGlAe8BYgGRAaUB7wFiAZEBpQHvAWIBkQGlAe8BYgGRAaUB7wFiAZEBpQHvAWIBkQGlAe8BYgGR
-        AaUB7wFiAZEBpQHvAWIBkQGlAe8BYgGRAaUB7wFiAZEBpQHvAWIBkQGlAe8BYgGRAaUB7wFXAloBtwgA
-        AxoBJANQAZ8DUgGoA1IBqANSAagDUgGoA1IBqANSAagDUgGoA1IBqANQAZ0DGAEhSAADDQESAx8BLANU
-        AbkDQQHnA0EB5wNBAecDQQHnA0EB5wNBAecDQQHnA0EB5wNBAecDQQHnA1QBuQMfASwDDQESAVwBrgHR
-        AfgBYAHMAv8BYAHMAv8BYAHMAv8BYAHMAv8BYAHMAv8BYAHMAv8BYAHMAv8BYAHMAv8BYAHMAv8BYAHM
-        Av8BYAHMAv8BYAHMAv8BYAHMAv8BYAHMAv8BWgGgAb4B9QgAA1ABowMSARkgAAMUARwDUAGdHAADBgEI
-        AwoEDQESASIBggFRAfcDDQESAwsBDwMHAQkDAAEBFAADUAHbA14B/wNZAf8DWQH/A1kB/wNZAf8DWQH/
-        A1kB/wNZAf8DWQH/A14B/wNQAdsIAAFgAcwC/wFgAcwC/wFgAcwC/wFgAcwC/wFgAcwC/wFgAcwC/wFg
-        AcwC/wFgAcwC/wFgAcwC/wFgAcwC/wFgAcwC/wFgAcwC/wFgAcwC/wFgAcwC/wFgAcwC/wFgAbsB3wH8
-        CAADUwGsKAADUgGoFAADBAEGAwsBDwMSARgDKQE+AUQBpQF0AfoBhQHlAbUB/wMbASYDGAEiAxQBGwMO
-        ARMDBwEKEAADVQHOA1wB/wLQAcQB/wLzAeQB/wLzAeQB/wLzAeQB/wLzAeQB/wLzAeQB/wLzAeQB/wLQ
-        AcQB/wNcAf8DVQHOCAABYAHMAv8BYAHMAv8BYAHMAv8BYAHMAv8BYAHMAv8BYAHMAv8BYAHMAv8BYAHM
-        Av8BYAHMAv8BYAHMAv8BYAHMAv8BYAHMAv8BYAHMAv8BYAHMAv8BYAHMAv8BYAG7Ad8B/AgAA1MBrAQA
-        AyABLwNTAawDUwGsA1MBrANTAawDUwGsA1MBrAMfASwEAANSAagQAAMCAQMDCgEOAxIBGQFDAUoBRgGE
-        AWcByQGYAf8BEwHEAWkB/wGFAeQBtAH/AyYBOgMiATIDHAEoAxUBHQMOARMDBgEIDAADVgHJA14B/wL1
-        AeYB/wLqAdwB/wLqAdwB/wLqAdwB/wLqAdwB/wLqAdwB/wLqAdwB/wL1AeYB/wNeAf8DVgHJCAABYAHM
-        Av8BYAHMAv8BYAHMAv8BYAHMAv8BYAHMAv8BYAHMAv8BYAHMAv8BYAHMAv8BYAHMAv8BYAHMAv8BYAHM
-        Av8BYAHMAv8BYAHMAv8BYAHMAv8BYAHMAv8BYAG7Ad8B/AgAA1MBrCgAA1IBqBAAAwMBBAMLAQ8BMgFn
-        AU0B1QF1Ac4BogH/AQoBtAFeAf8BDQG8AWMB/wGDAd8BsQH/AYMB3QGwAf8BggHZAa0B/wGAAdUBqgH/
-        AX0BzwGmAf8BAgFxATgB/wMHAQkMAAM7AWMDUgHjAvcB6wH/Au0B4gH/Au0B4gH/Au0B4gH/Au0B4gH/
-        Au0B4gH/Au0B4gH/AvcB6wH/A2EB/wNWAcUIAAFgAcwC/wFgAcwC/wFgAcwC/wFgAcwC/wFgAcwC/wFg
-        AcwC/wFgAcwC/wFgAcwC/wFgAcwC/wFgAcwC/wFgAcwC/wFgAcwC/wFgAcwC/wFgAcwC/wFgAcwC/wFg
-        AbsB3wH8CAADUwGsBAADEQEXAzQBVAM0AVQDNAFUAzQBVAM0AVQDNAFUAxABFQQAA1IBqBQAARYBcQFC
-        AfUBXQHAAY8B/wEGAaUBVAH/AQkBrgFaAf8BCgG0AV4B/wELAbcBYAH/AQsBtQFfAf8BCQGvAVsB/wEH
-        AacBVQH/AQQBngFPAf8BAgFxATgB/wMCAQMQAANVAcEC+QHvAf8C8QHoAf8C8QHoAf8C8QHoAf8C8QHo
-        Af8C8QHoAf8C8QHoAf8C+QHvAf8DZQH/A1UBwQgAAWABzAL/AWABzAL/AWABzAL/AWABzAL/AWABzAL/
-        AWABzAL/AWABzAL/AWABzAL/AWABzAL/AWABzAL/AWABzAL/AWABzAL/AWABzAL/AWABzAL/AWABzAL/
-        AWABuwHfAfwIAANTAawEAAMSARkDNQFYAzUBWAM1AVgDNQFYAzUBWAM1AVgDEQEXBAADUgGoEAABMwGL
-        AVoB9wFiAcABkQH/AUkBtQF9Af8BSwG6AYQB/wFLAb8BhgH/ASYBtQFsAf8BCQGuAVkB/wEIAawBWAH/
-        AQcBqAFVAf8BBQGhAVEB/wEMAZ0BUgH/AQIBcQE4Af8UAANWAb4C+wH0Af8C9QHvAf8C9QHvAf8C9QHv
-        Af8C9QHvAf8C9QHvAf8C9QHvAf8C+wH0Af8DaAH/A1YBvggAAWABzAL/AWABzAL/AWABzAL/AWABzAL/
-        AWABzAL/AWABzAL/AWABzAL/AWABzAL/AWABzAL/AWABzAL/AWABzAL/AWABzAL/AWABzAL/AWABzAL/
-        AWABzAL/AWABuwHfAfwIAANTAawoAANSAagQAAE7AT4BPAFoAYwBywGrAf8BWQG8AYsB/wFYAbwBigH/
-        AVgBvwGMAf8BVgHAAYwB/wFRAb8BiAH/AUkBvAGDAf8BQgG3AXsB/wE4Aa8BcQH/AS8BqwFrAf8BCgFy
-        ATwB+hQAA1YBuwL9AfgB/wL5AfUB/wL5AfUB/wL5AfUB/wL5AfUB/wL5AfUB/wL5AfUB/wL9AfgB/wNX
-        Ad0DOAFeCAABYAHMAv8BYAHMAv8BYAHMAv8BYAHMAv8BYAHMAv8BYAHMAv8BYAHMAv8BYAHMAv8BYAHM
-        Av8BYAHMAv8BYAHMAv8BYAHMAv8BYAHMAv8BYAHMAv8BYAHMAv8BYAG7Ad8B/AgAA1MBrAQAAyABLgNS
-        AagDUgGoA1IBqANSAagDUgGoA1IBqAMeASsEAANSAagUAAMYASIBZgGtAYgB+gF0AccBngH/AWUBwQGT
-        Af8BYAG/AZAB/wFZAb0BjAH/AVEBuQGGAf8BSQG1AX0B/wE/AbEBdgH/ATUBrQFvAf8BEAFuAT0B9xQA
-        A1YBuAL+AfwB/wL8AfoB/wL8AfoB/wL8AfoB/wL8AfoB/wL8AfoB/wL8AfoB/wL+AfwB/wNWAbgMAAFg
-        AcwC/wFgAcwC/wFgAcwC/wFgAcwC/wFgAcwC/wFgAcwC/wFgAcwC/wFgAcwC/wFgAcwC/wFgAcwC/wFg
-        AcwC/wFgAcwC/wFgAcwC/wFgAcwC/wFgAcwC/wFgAbsB3wH8CAADUwGsKAADUgGoGAADAQECATcBiwFi
-        AfcBlQHUAbQB/wFqAcMBlwH/AaoB3AHDAf8BAgFxATgB/wECAXEBOAH/AQIBcQE4Af8BAgFxATgB/wEC
-        AXEBOAH/EAADNwFbA1kB2gLgAd8D/wH+A/8B/gP/Af4D/wH+A/8B/gP/Af4B/wLgAd8B/wNZAdoDNwFb
-        CAABYAHMAv8BYAHMAv8BYAHMAv8BYAHMAv8BYAHMAv8BYAHMAv8BYAHMAv8BYAHMAv8BYAHMAv8BYAHM
-        Av8BYAHMAv8BYAHMAv8BYAHMAv8BYAHMAv8BYAHMAv8BWgG9AesB/QgAA1MBrCgAA1IBqCAAASABcwFI
-        Ae4BpwHbAcEB/wGrAd0BxAH/JAADVAGyA3YB/wNtAf8DbQH/A20B/wNtAf8DbQH/A20B/wNtAf8DbQH/
-        A4QB/wNUAbIIAAFfAcoB/AH/AWABzAL/AWABzAL/AWABzAL/AWABzAL/AWABzAL/AWABzAL/AWABzAL/
-        AWABzAL/AWABzAL/AWABzAL/AWABzAL/AWABzAL/AWABzAL/AWABzAL/AWUBvAHuAf4IAANTAawYAAMR
-        ARcDNAFUAzQBVAM0AVQDUgGoJAABQgFeAVABtAGsAdwBwwH/JAADUwGwA3gB/wNvAf8DbwH/A28B/wNv
-        Af8DbwH/A28B/wNvAf8DhgH/A1MBsAM1AVgIAAFYAb4B7QH/AXYB0gH9Af8BgwHWAv8BgwHWAv8BgwHW
-        Av8BgwHWAv8BgwHWAv8BgwHWAv8BgwHWAv8BgwHWAv8BgwHWAv8BgwHWAv8BgwHWAv8BgwHWAv8BdgHS
-        Af0B/wFeAa8B3wH+CAADUwGsGAADNQFYA0sBkAM3AVoDUAHXAzEBTygAATQBNgE1AVYkAANTAa4DhAH/
-        A3kB/wN5Af8DeQH/A3kB/wN5Af8DeQH/A4gB/wNTAa4DNQFYDAABTAGjAcwB/wHLAeQB8AH/AeoB9AH5
-        Af8B6gH0AfkB/wHqAfQB+QH/AeoB9AH5Af8B6gH0AfkB/wHqAfQB+QH/AeoB9AH5Af8B6gH0AfkB/wHq
-        AfQB+QH/AeoB9AH5Af8B6gH0AfkB/wHqAfQB+QH/AckB4gHvAf8BVgGGAaEB9QgAA1MBrBgAAzUBWAM1
-        AVYDTgGZAzMBUlQAA0YBgQNTAawDUwGsA1MBrANTAawDUwGsA1MBrANTAawDUwGsAzUBVhAAAUYBkQG7
-        AfwBTAGjAcwB/wFPAaQBzQH/AU8BpAHNAf8BTwGkAc0B/wFJAZIBuwH8AVgBfwGRAe8BWAF/AZEB7wFY
-        AX8BkQHvAVgBfwGRAe8BWAF/AZEB7wFYAX8BkQHvAVgBfwGRAe8BWAF/AZEB7wFYAX8BkQHvAVUBWQFa
-        AboIAANQAaMDEgEYFAADNQFYA1EB1QMzAVKQAAFZAV8BYgHJAUwBowHMAf8BTAGjAcwB/wFMAaMBzAH/
-        AUwBowHMAf8BWQFeAWEBxzAAAxsBJgNQAaMDUwGsA1MBrANTAawDUwGsA1MBrANTAawDMQFPFAABQgFN
-        AT4HAAE+AwABKAMAAUADAAEgAwABAQEAAQEGAAEBFgAD/4EAAv8EAAHAAQMC/wQAAc8B8wH4AQcBwAED
-        AgAB3wH7AeABAwHAAQMCAAHQAQsBwAEBAcABAwIAAd8B+wHAAQEBwAEDAgAB0AELAeABAQHgAQMCAAHQ
-        AQsBwAEDAeABAwIAAd8B+wHAAQMB4AEDAgAB0AELAeABAwHgAQcCAAHfAfsB8AEDAcABAwIAAd8B+wH8
-        AX8BwAEDAgAB3wGDAf4BfwHAAQMCAAHfAYMB/wF/AcABBwIAAd8BhwL/AcABDwIAAc8BjwT/AQMB/wHA
-        AR8L
+        ARoDEwEaAxMBGgMTARoDEwEaAxMBGgMTARoDEwEaAxMBGgMTARoDEwEaAxMBGgMQARYDBwEJA1gBvAFi
+        AYwBnQHvAWIBjAGdAe8BYgGMAZ0B7wFiAYwBnQHvAWIBjAGdAe8BYgGMAZ0B7wFiAYwBnQHvAWIBjAGd
+        Ae8BYgGMAZ0B7wFiAYwBnQHvAWIBjAGdAe8BYgGMAZ0B7wFiAYwBnQHvAWIBjAGdAe8BVwJZAbcIAAMa
+        ASQDUAGfA1IBqANSAagDUgGoA1IBqANSAagDUgGoA1IBqANSAagDUAGdAxgBIUgAAw0BEgMfASwDVQG5
+        A0cB5wNHAecDRwHnA0cB5wNHAecDRwHnA0cB5wNHAecDRwHnA0cB5wNVAbkDHwEsAw0BEgFcAakBygH4
+        AV8BzAL/AV8BzAL/AV8BzAL/AV8BzAL/AV8BzAL/AV8BzAL/AV8BzAL/AV8BzAL/AV8BzAL/AV8BzAL/
+        AV8BzAL/AV8BzAL/AV8BzAL/AV8BzAL/AVkBmwG3AfUIAANQAaMDEgEZIAADFAEcA1ABnRwAAwYBCAMK
+        BA0BEgEmAYEBUQH3Aw0BEgMLAQ8DBwEJAwABARQAA1QB2wNdAf8DWAH/A1gB/wNYAf8DWAH/A1gB/wNY
+        Af8DWAH/A1gB/wNdAf8DVAHbCAABXwHMAv8BXwHMAv8BXwHMAv8BXwHMAv8BXwHMAv8BXwHMAv8BXwHM
+        Av8BXwHMAv8BXwHMAv8BXwHMAv8BXwHMAv8BXwHMAv8BXwHMAv8BXwHMAv8BXwHMAv8BXwG5AdoB/AgA
+        A1MBrCgAA1IBqBQAAwQBBgMLAQ8DEgEYAykBPgFFAaMBcwH6AYUB5QG1Af8DGwEmAxgBIgMUARsDDgET
+        AwcBChAAA1gBzgNbAf8C0AHEAf8C8wHkAf8C8wHkAf8C8wHkAf8C8wHkAf8C8wHkAf8C8wHkAf8C0AHE
+        Af8DWwH/A1gBzggAAV8BzAL/AV8BzAL/AV8BzAL/AV8BzAL/AV8BzAL/AV8BzAL/AV8BzAL/AV8BzAL/
+        AV8BzAL/AV8BzAL/AV8BzAL/AV8BzAL/AV8BzAL/AV8BzAL/AV8BzAL/AV8BuQHaAfwIAANTAawEAAMg
+        AS8DUwGsA1MBrANTAawDUwGsA1MBrANTAawDHwEsBAADUgGoEAADAgEDAwoBDgMSARkBRwFIAUcBhAFm
+        AckBmAH/ARIBxAFoAf8BhQHkAbQB/wMnAToDIgEyAxwBKAMVAR0DDgETAwYBCAwAA1gByQNdAf8C9QHm
+        Af8C6gHcAf8C6gHcAf8C6gHcAf8C6gHcAf8C6gHcAf8C6gHcAf8C9QHmAf8DXQH/A1gByQgAAV8BzAL/
+        AV8BzAL/AV8BzAL/AV8BzAL/AV8BzAL/AV8BzAL/AV8BzAL/AV8BzAL/AV8BzAL/AV8BzAL/AV8BzAL/
+        AV8BzAL/AV8BzAL/AV8BzAL/AV8BzAL/AV8BuQHaAfwIAANTAawoAANSAagQAAMDAQQDCwEPAUABYwFR
+        AdUBdAHOAaIB/wEJAbQBXQH/AQwBvAFiAf8BgwHfAbEB/wGDAd0BsAH/AYIB2QGtAf8BgAHVAaoB/wF8
+        Ac8BpgH/AQEBcAE3Af8DBwEJDAADOwFjA1UB4wL3AesB/wLtAeIB/wLtAeIB/wLtAeIB/wLtAeIB/wLt
+        AeIB/wLtAeIB/wL3AesB/wNgAf8DVwHFCAABXwHMAv8BXwHMAv8BXwHMAv8BXwHMAv8BXwHMAv8BXwHM
+        Av8BXwHMAv8BXwHMAv8BXwHMAv8BXwHMAv8BXwHMAv8BXwHMAv8BXwHMAv8BXwHMAv8BXwHMAv8BXwG5
+        AdoB/AgAA1MBrAQAAxEBFwM0AVQDNAFUAzQBVAM0AVQDNAFUAzQBVAMQARUEAANSAagUAAEaAW8BQgH1
+        AVwBwAGPAf8BBQGlAVMB/wEIAa4BWQH/AQkBtAFdAf8BCgG3AV8B/wEKAbUBXgH/AQgBrwFaAf8BBgGn
+        AVQB/wEDAZ4BTgH/AQEBcAE3Af8DAgEDEAADVgHBAvkB7wH/AvEB6AH/AvEB6AH/AvEB6AH/AvEB6AH/
+        AvEB6AH/AvEB6AH/AvkB7wH/A2QB/wNWAcEIAAFfAcwC/wFfAcwC/wFfAcwC/wFfAcwC/wFfAcwC/wFf
+        AcwC/wFfAcwC/wFfAcwC/wFfAcwC/wFfAcwC/wFfAcwC/wFfAcwC/wFfAcwC/wFfAcwC/wFfAcwC/wFf
+        AbkB2gH8CAADUwGsBAADEgEZAzUBWAM1AVgDNQFYAzUBWAM1AVgDNQFYAxEBFwQAA1IBqBAAATUBiQFZ
+        AfcBYQHAAZEB/wFIAbUBfAH/AUoBugGEAf8BSgG/AYYB/wElAbUBawH/AQgBrgFYAf8BBwGsAVcB/wEG
+        AagBVAH/AQQBoQFQAf8BCwGdAVEB/wEBAXABNwH/FAADVgG+AvsB9AH/AvUB7wH/AvUB7wH/AvUB7wH/
+        AvUB7wH/AvUB7wH/AvUB7wH/AvsB9AH/A2cB/wNWAb4IAAFfAcwC/wFfAcwC/wFfAcwC/wFfAcwC/wFf
+        AcwC/wFfAcwC/wFfAcwC/wFfAcwC/wFfAcwC/wFfAcwC/wFfAcwC/wFfAcwC/wFfAcwC/wFfAcwC/wFf
+        AcwC/wFfAbkB2gH8CAADUwGsKAADUgGoEAABPAE9ATwBaAGMAcsBqwH/AVgBvAGLAf8BVwG8AYoB/wFX
+        Ab8BjAH/AVUBwAGMAf8BUAG/AYgB/wFIAbwBgwH/AUEBtwF6Af8BNwGvAXAB/wEuAasBagH/AQ0BcQE9
+        AfoUAANWAbsC/QH4Af8C+QH1Af8C+QH1Af8C+QH1Af8C+QH1Af8C+QH1Af8C+QH1Af8C/QH4Af8DWAHd
+        AzgBXggAAV8BzAL/AV8BzAL/AV8BzAL/AV8BzAL/AV8BzAL/AV8BzAL/AV8BzAL/AV8BzAL/AV8BzAL/
+        AV8BzAL/AV8BzAL/AV8BzAL/AV8BzAL/AV8BzAL/AV8BzAL/AV8BuQHaAfwIAANTAawEAAMgAS4DUgGo
+        A1IBqANSAagDUgGoA1IBqANSAagDHgErBAADUgGoFAADGAEiAWQBqgGFAfoBcwHHAZ4B/wFkAcEBkwH/
+        AV8BvwGQAf8BWAG9AYwB/wFQAbkBhgH/AUgBtQF8Af8BPgGxAXUB/wE0Aa0BbgH/ARUBbQE+AfcUAANW
+        AbgC/gH8Af8C/AH6Af8C/AH6Af8C/AH6Af8C/AH6Af8C/AH6Af8C/AH6Af8C/gH8Af8DVgG4DAABXwHM
+        Av8BXwHMAv8BXwHMAv8BXwHMAv8BXwHMAv8BXwHMAv8BXwHMAv8BXwHMAv8BXwHMAv8BXwHMAv8BXwHM
+        Av8BXwHMAv8BXwHMAv8BXwHMAv8BXwHMAv8BXwG5AdoB/AgAA1MBrCgAA1IBqBgAAwEBAgE4AYkBYgH3
+        AZUB1AG0Af8BaQHDAZcB/wGqAdwBwwH/AQEBcAE3Af8BAQFwATcB/wEBAXABNwH/AQEBcAE3Af8BAQFw
+        ATcB/xAAAzcBWwNaAdoC4AHfA/8B/gP/Af4D/wH+A/8B/gP/Af4D/wH+Af8C4AHfAf8DWgHaAzcBWwgA
+        AV8BzAL/AV8BzAL/AV8BzAL/AV8BzAL/AV8BzAL/AV8BzAL/AV8BzAL/AV8BzAL/AV8BzAL/AV8BzAL/
+        AV8BzAL/AV8BzAL/AV8BzAL/AV8BzAL/AV8BzAL/AVgBvAHoAf0IAANTAawoAANSAaggAAEoAW8BSgHu
+        AacB2wHBAf8BqwHdAcQB/yQAA1UBsgN1Af8DbAH/A2wB/wNsAf8DbAH/A2wB/wNsAf8DbAH/A2wB/wOE
+        Af8DVQGyCAABXgHKAfwB/wFfAcwC/wFfAcwC/wFfAcwC/wFfAcwC/wFfAcwC/wFfAcwC/wFfAcwC/wFf
+        AcwC/wFfAcwC/wFfAcwC/wFfAcwC/wFfAcwC/wFfAcwC/wFfAcwC/wFlAboB7AH+CAADUwGsGAADEQEX
+        AzQBVAM0AVQDNAFUA1IBqCQAAUwBWgFSAbQBrAHcAcMB/yQAA1MBsAN3Af8DbgH/A24B/wNuAf8DbgH/
+        A24B/wNuAf8DbgH/A4YB/wNTAbADNQFYCAABVwG+Ae0B/wF1AdIB/QH/AYMB1gL/AYMB1gL/AYMB1gL/
+        AYMB1gL/AYMB1gL/AYMB1gL/AYMB1gL/AYMB1gL/AYMB1gL/AYMB1gL/AYMB1gL/AYMB1gL/AXUB0gH9
+        Af8BXgGtAd0B/ggAA1MBrBgAAzUBWANLAZADNwFaA1MB1wMxAU8oAAM1AVYkAANUAa4DhAH/A3gB/wN4
+        Af8DeAH/A3gB/wN4Af8DeAH/A4gB/wNUAa4DNQFYDAABSwGjAcwB/wHLAeQB8AH/AeoB9AH5Af8B6gH0
+        AfkB/wHqAfQB+QH/AeoB9AH5Af8B6gH0AfkB/wHqAfQB+QH/AeoB9AH5Af8B6gH0AfkB/wHqAfQB+QH/
+        AeoB9AH5Af8B6gH0AfkB/wHqAfQB+QH/AckB4gHvAf8BVwGEAZwB9QgAA1MBrBgAAzUBWAM1AVYDTgGZ
+        AzMBUlQAA0YBgQNTAawDUwGsA1MBrANTAawDUwGsA1MBrANTAawDUwGsAzUBVhAAAUQBjgG5AfwBSwGj
+        AcwB/wFOAaQBzQH/AU4BpAHNAf8BTgGkAc0B/wFHAY8BuQH8AVgBewGMAe8BWAF7AYwB7wFYAXsBjAHv
+        AVgBewGMAe8BWAF7AYwB7wFYAXsBjAHvAVgBewGMAe8BWAF7AYwB7wFYAXsBjAHvAVUBWAFZAboIAANQ
+        AaMDEgEYFAADNQFYA1UB1QMzAVKQAAFZAV4BXwHJAUsBowHMAf8BSwGjAcwB/wFLAaMBzAH/AUsBowHM
+        Af8BWQFcAV4BxzAAAxsBJgNQAaMDUwGsA1MBrANTAawDUwGsA1MBrANTAawDMQFPFAABQgFNAT4HAAE+
+        AwABKAMAAUADAAEgAwABAQEAAQEGAAEBFgAD/4EAAv8EAAHAAQMC/wQAAc8B8wH4AQcBwAEDAgAB3wH7
+        AeABAwHAAQMCAAHQAQsBwAEBAcABAwIAAd8B+wHAAQEBwAEDAgAB0AELAeABAQHgAQMCAAHQAQsBwAED
+        AeABAwIAAd8B+wHAAQMB4AEDAgAB0AELAeABAwHgAQcCAAHfAfsB8AEDAcABAwIAAd8B+wH8AX8BwAED
+        AgAB3wGDAf4BfwHAAQMCAAHfAYMB/wF/AcABBwIAAd8BhwL/AcABDwIAAc8BjwT/AQMB/wHAAR8L
 </value>
   </data>
   <metadata name="$this.TrayHeight" type="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">

+ 5 - 0
EsPy/EsPy.csproj

@@ -220,6 +220,7 @@
     <Compile Include="Units\ResultStatus.cs" />
     <Compile Include="Units\PyFile.cs" />
     <Compile Include="Units\SerialPort.cs" />
+    <Compile Include="Units\StatVfs.cs" />
     <Compile Include="Utility\BinaryString.cs" />
     <Compile Include="Utility\FileFormat.cs" />
     <Compile Include="Utility\FileFormats.cs" />
@@ -229,7 +230,11 @@
     <None Include="pip.bat">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </None>
+    <Content Include="Lib\ssd1306.py">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
     <Content Include="Release\EsPy.1.0.0.4.7z" />
+    <None Include="Release\EsPy.1.0.0.5.7z" />
     <None Include="Resources\error16.png" />
     <None Include="Resources\info.png" />
     <None Include="Resources\compile.png" />

+ 4 - 2
EsPy/Forms/EditorForm.Designer.cs

@@ -295,6 +295,7 @@
             this.mnComment.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.K)));
             this.mnComment.Size = new System.Drawing.Size(183, 22);
             this.mnComment.Text = "Comment";
+            this.mnComment.Click += new System.EventHandler(this.mnComment_Click);
             // 
             // mnUncommet
             // 
@@ -304,6 +305,7 @@
             this.mnUncommet.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.U)));
             this.mnUncommet.Size = new System.Drawing.Size(183, 22);
             this.mnUncommet.Text = "Uncomment";
+            this.mnUncommet.Click += new System.EventHandler(this.mnUncommet_Click);
             // 
             // toolStripMenuItem6
             // 
@@ -709,10 +711,10 @@
             this.scintilla.IndentationGuides = ScintillaNET.IndentView.LookBoth;
             this.scintilla.IndentWidth = 4;
             this.scintilla.Lexer = ScintillaNET.Lexer.Html;
-            this.scintilla.Location = new System.Drawing.Point(0, 39);
+            this.scintilla.Location = new System.Drawing.Point(0, 24);
             this.scintilla.MouseDwellTime = 500;
             this.scintilla.Name = "scintilla";
-            this.scintilla.Size = new System.Drawing.Size(636, 223);
+            this.scintilla.Size = new System.Drawing.Size(636, 238);
             this.scintilla.TabIndex = 2;
             this.scintilla.SavePointLeft += new System.EventHandler<System.EventArgs>(this.scintilla_SavePointLeft);
             this.scintilla.SavePointReached += new System.EventHandler<System.EventArgs>(this.scintilla_SavePointReached);

BIN
EsPy/Helps/images/filemanager.png


+ 6 - 13
EsPy/Lib/dht.py

@@ -5,28 +5,21 @@ import esp
 
 class DHTBase:
     def __init__(self, pin):
-        self.pin = pin
-        self.buf = bytearray(5)
+        pass
 
     def measure(self):
-        buf = self.buf
-        esp.dht_readinto(self.pin, buf)
-        if (buf[0] + buf[1] + buf[2] + buf[3]) & 0xff != buf[4]:
-            raise Exception("checksum error")
+        pass
 
 class DHT11(DHTBase):
     def humidity(self):
-        return self.buf[0]
+        pass
 
     def temperature(self):
-        return self.buf[2]
+        pass
 
 class DHT22(DHTBase):
     def humidity(self):
-        return (self.buf[0] << 8 | self.buf[1]) * 0.1
+        pass
 
     def temperature(self):
-        t = ((self.buf[2] & 0x7f) << 8 | self.buf[3]) * 0.1
-        if self.buf[2] & 0x80:
-            t = -t
-        return t
+        pass

+ 5 - 29
EsPy/Lib/flashbdev.py

@@ -7,43 +7,19 @@ class FlashBdev:
     NUM_BLK = 0x6b
 
     def __init__(self, blocks=NUM_BLK):
-        self.blocks = blocks
+        pass
 
     def readblocks(self, n, buf):
-        #print("readblocks(%s, %x(%d))" % (n, id(buf), len(buf)))
-        esp.flash_read((n + self.START_SEC) * self.SEC_SIZE, buf)
+        pass
 
     def writeblocks(self, n, buf):
-        #print("writeblocks(%s, %x(%d))" % (n, id(buf), len(buf)))
-        #assert len(buf) <= self.SEC_SIZE, len(buf)
-        esp.flash_erase(n + self.START_SEC)
-        esp.flash_write((n + self.START_SEC) * self.SEC_SIZE, buf)
+        pass
 
     def ioctl(self, op, arg):
-        #print("ioctl(%d, %r)" % (op, arg))
-        if op == 4:  # BP_IOCTL_SEC_COUNT
-            return self.blocks
-        if op == 5:  # BP_IOCTL_SEC_SIZE
-            return self.SEC_SIZE
+        pass
 
 def set_bl_flash_size(real_size):
-    if real_size == 256*1024:
-        code = 1
-    elif real_size == 512*1024:
-        code = 0
-    elif real_size == 1024*1024:
-        code = 2
-    elif real_size == 2048*1024:
-        code = 3
-    elif real_size == 4096*1024:
-        code = 4
-    else:
-        code = 2
-    buf = bytearray(4096)
-    esp.flash_read(0, buf)
-    buf[3] = (buf[3] & 0xf) | (code << 4)
-    esp.flash_erase(0)
-    esp.flash_write(0, buf)
+    pass
 
 # If bootloader size ID doesn't correspond to real Flash size,
 # fix bootloader value and reboot.

+ 5 - 14
EsPy/Lib/neopixel.py

@@ -8,25 +8,16 @@ class NeoPixel:
     ORDER = (1, 0, 2, 3)
 
     def __init__(self, pin, n, bpp=3):
-        self.pin = pin
-        self.n = n
-        self.bpp = bpp
-        self.buf = bytearray(n * bpp)
-        self.pin.init(pin.OUT)
+        pass
 
     def __setitem__(self, index, val):
-        offset = index * self.bpp
-        for i in range(self.bpp):
-            self.buf[offset + self.ORDER[i]] = val[i]
+        pass
 
     def __getitem__(self, index):
-        offset = index * self.bpp
-        return tuple(self.buf[offset + self.ORDER[i]]
-                     for i in range(self.bpp))
+        pass
 
     def fill(self, color):
-        for i in range(self.n):
-            self[i] = color
+        pass
 
     def write(self):
-        neopixel_write(self.pin, self.buf, True)
+        pass

+ 2 - 17
EsPy/Lib/ntptime.py

@@ -13,24 +13,9 @@ NTP_DELTA = 3155673600
 host = "pool.ntp.org"
 
 def time():
-    NTP_QUERY = bytearray(48)
-    NTP_QUERY[0] = 0x1b
-    addr = socket.getaddrinfo(host, 123)[0][-1]
-    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
-    s.settimeout(1)
-    res = s.sendto(NTP_QUERY, addr)
-    msg = s.recv(48)
-    s.close()
-    val = struct.unpack("!I", msg[40:44])[0]
-    return val - NTP_DELTA
+    pass
 
 # There's currently no timezone support in MicroPython, so
 # utime.localtime() will return UTC time (as if it was .gmtime())
 def settime():
-    t = time()
-    import machine
-    import utime
-    tm = utime.localtime(t)
-    tm = tm[0:3] + (0,) + tm[3:6] + (0,)
-    machine.RTC().datetime(tm)
-    print(utime.localtime())
+    pass

+ 85 - 0
EsPy/Lib/ssd1306.py

@@ -0,0 +1,85 @@
+# MicroPython SSD1306 OLED driver, I2C and SPI interfaces
+
+from micropython import const
+import time
+import framebuf
+
+
+# register definitions
+SET_CONTRAST        = const(0x81)
+SET_ENTIRE_ON       = const(0xa4)
+SET_NORM_INV        = const(0xa6)
+SET_DISP            = const(0xae)
+SET_MEM_ADDR        = const(0x20)
+SET_COL_ADDR        = const(0x21)
+SET_PAGE_ADDR       = const(0x22)
+SET_DISP_START_LINE = const(0x40)
+SET_SEG_REMAP       = const(0xa0)
+SET_MUX_RATIO       = const(0xa8)
+SET_COM_OUT_DIR     = const(0xc0)
+SET_DISP_OFFSET     = const(0xd3)
+SET_COM_PIN_CFG     = const(0xda)
+SET_DISP_CLK_DIV    = const(0xd5)
+SET_PRECHARGE       = const(0xd9)
+SET_VCOM_DESEL      = const(0xdb)
+SET_CHARGE_PUMP     = const(0x8d)
+
+
+class SSD1306:
+    def __init__(self, width, height, external_vcc):
+        pass
+
+    def init_display(self):
+        pass
+
+    def poweroff(self):
+        pass
+
+    def contrast(self, contrast):
+        pass
+
+    def invert(self, invert):
+        pass
+
+    def show(self):
+        pass
+
+    def fill(self, col):
+        pass
+
+    def pixel(self, x, y, col):
+        pass
+
+    def scroll(self, dx, dy):
+        pass
+
+    def text(self, string, x, y, col=1):
+        pass
+
+
+class SSD1306_I2C(SSD1306):
+    def __init__(self, width, height, i2c, addr=0x3c, external_vcc=False):
+        pass
+
+    def write_cmd(self, cmd):
+        pass
+
+    def write_data(self, buf):
+        pass
+
+    def poweron(self):
+        pass
+
+
+class SSD1306_SPI(SSD1306):
+    def __init__(self, width, height, spi, dc, res, cs, external_vcc=False):
+        pass
+
+    def write_cmd(self, cmd):
+        pass
+
+    def write_data(self, buf):
+        pass
+
+    def poweron(self):
+        pass

+ 2 - 2
EsPy/Properties/AssemblyInfo.cs

@@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
 // You can specify all the values or you can default the Build and Revision Numbers 
 // by using the '*' as shown below:
 // [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("1.0.0.4")]
-[assembly: AssemblyFileVersion("1.0.0.4")]
+[assembly: AssemblyVersion("1.0.0.5")]
+[assembly: AssemblyFileVersion("1.0.0.5")]

+ 1 - 1
EsPy/Python/PyClient.cs

@@ -109,7 +109,7 @@ namespace EsPy.Python
                 {
                     this.Client = new TcpClient();
                     // Todo: test size
-                    this.Client.ReceiveBufferSize = 1024;
+                    //this.Client.ReceiveBufferSize = 1024;
                     this.Client.ReceiveTimeout = 3000;
                     this.Client.SendTimeout = 3000;
                     this.Client.Connect(this.Address, this.Port);

+ 12 - 8
EsPy/Scripts/PyHost.py

@@ -31,8 +31,8 @@ def serialize_completions(completions):
     try:
         for completion in completions:
             #print(dir(item))
-            #if completion.module_name == '__builtin__':
-            #    continue
+            if completion.module_name == '__builtin__':
+                continue
             #print(completion.module_path)
 
             params = []
@@ -65,7 +65,7 @@ def serialize_completions(completions):
         return json.dumps({'completions': items})
     except Exception as e:
         print("EXCEPTION: ", e)
-        pass
+        return "ERR"
 
 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 s.bind((TCP_IP, TCP_PORT))
@@ -76,17 +76,20 @@ print 'Connection address:', addr
 while 1:
     data = conn.recv(4)
     dlen = unpack('i', data)
-    data = conn.recv(dlen[0])
-    
-    obj = Proc(data)
+    data = ""
+
+    while len(data) < dlen[0]:
+        data += conn.recv(dlen[0])
+
+    obj = Proc(data)           
     result = 'No suggestion';
     print "MODULE: " + obj.Module
     print "METHOD: " + obj.Method
   
     if obj.Module == 'jedi':
         if obj.Method == 'completion':
-            script = jedi.Script(obj.Script['Source'], obj.Script['Line'], obj.Script['Column']) 
-            result = serialize_completions(script.completions())
+                script = jedi.Script(obj.Script['Source'], obj.Script['Line'], obj.Script['Column']) 
+                result = serialize_completions(script.completions())
         elif obj.Method == "hello":
             result = json.dumps({"respose": "hello"})
         elif obj.Method == "bye":
@@ -101,4 +104,5 @@ while 1:
     print("LEN: ", dlen, "SENT: ", n)
 
 conn.close()
+#input("Press Enter to continue...")
 sys.exit()

+ 17 - 1
EsPy/Units/PySerial.cs

@@ -308,7 +308,7 @@ namespace EsPy.Units
         {
             List<string> prog = new List<string>();
             prog.Add("import os");
-            prog.Add($"os.stat('{fname}')");
+            prog.Add($"os.stat('{fname}')");          
             ResultStatus res = this.Exec(prog);
             if (res.Result == ResultStatus.Statuses.Error)
                 return res;
@@ -318,6 +318,22 @@ namespace EsPy.Units
             return res;
         }
 
+        public ResultStatus StatVfs()
+        {
+            List<string> prog = new List<string>();
+            prog.Add("import os");
+            prog.Add("os.statvfs('/')");
+            ResultStatus res = this.Exec(prog);
+            if (res.Result == ResultStatus.Statuses.Error)
+                return res;
+
+            res.Data = Units.StatVfs.Create(res.ToString());
+
+            //string[] items = res.ToString().Replace("(", "").Replace(")", "").Split(',');
+            //res.Data = new PyFile(fname, int.Parse(items[0].Trim()), int.Parse(items[6].Trim()));
+            return res;
+        }
+
         public ResultStatus Cd(string path)
         {
             List<string> prog = new List<string>();

+ 76 - 0
EsPy/Units/StatVfs.cs

@@ -0,0 +1,76 @@
+using EsPy.Utility;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace EsPy.Units
+{
+    public class StatVfs
+    {
+
+
+        public int BSize = 0;           //f_bsize – file system block size
+        public int FrSize = 0;          //f_frsize – fragment size
+        public int SizeInFsUnits = 0;   //f_blocks – size of fs in f_frsize units
+        public int BFree = 0;           //f_bfree – number of free blocks
+        public int BAvail = 0;          //f_bavail – number of free blocks for unpriviliged users
+        public int Files = 0;           //f_files – number of inodes
+        public int FFree = 0;           //f_ffree – number of free inodes
+        public int FAvail = 0;          //f_favail – number of free inodes for unpriviliged users
+        public int Flag = 0;            //f_flag – mount flags
+        public int NameMax = 0;         //f_namemax – maximum filename length
+
+        public const float MegaByte = 1024 * 1024;
+        private StatVfs()
+        {
+        }
+
+        public static StatVfs Create(string stat)
+        {
+            String[] items = TextHelper.Matches(@"(\d+?)[,)]", stat);
+            if (items != null)
+            {
+                StatVfs fs = new StatVfs();
+                fs.BSize = int.Parse(items[0]);  
+                fs.FrSize = int.Parse(items[1]); 
+                fs.SizeInFsUnits = int.Parse(items[2]);
+                fs.BFree = int.Parse(items[3]); 
+                fs.BAvail = int.Parse(items[4]);
+                fs.Files = int.Parse(items[5]);
+                fs.FFree = int.Parse(items[6]);
+                fs.FAvail = int.Parse(items[7]);
+                fs.Flag = int.Parse(items[8]);  
+                fs.NameMax = int.Parse(items[9]);
+                return fs;
+            }
+            return null;
+        }
+
+
+        public float TotalBytes
+        { get { return this.FrSize * SizeInFsUnits; } }
+
+        public float FreeBytes
+        { get { return this.BSize * this.BFree; } }
+
+        public float TotalMegaBytes
+        {  get { return this.TotalBytes / MegaByte; } }
+
+        public float FreeMegaBytes
+        { get { return this.FreeBytes / MegaByte; } }
+
+        public float Usage
+        {
+            get
+            {
+                if (this.TotalBytes != 0)
+                    return this.FreeBytes / this.TotalBytes;
+                return float.NaN;
+            }
+        }
+
+
+    }
+}

+ 17 - 0
EsPy/Utility/TextHelper.cs

@@ -2,6 +2,7 @@
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
+using System.Text.RegularExpressions;
 using System.Threading.Tasks;
 
 namespace EsPy.Utility
@@ -15,6 +16,22 @@ namespace EsPy.Utility
             public string Filter = "";
         }
 
+        public static string[] Matches(string pattern, string text)
+        {
+            Regex re = new Regex(pattern);
+            if (re.IsMatch(text))
+            {
+                MatchCollection items = re.Matches(text);
+                string[] res = new string[items.Count];
+                for(int i = 0; i < items.Count; i++)
+                {
+                    res[i] = items[i].Groups[1].Value;
+                }
+                return res;
+            }
+            return null;
+        }
+
         public static Words FindWords(string text, int from)
         {
             Words words = new Words();