czwartek, 8 stycznia 2015

C# - odczyt pliku XML do DataGridView

Witajcie!
Chciałbym pokazać najprostszy sposób odczytania zawartości pliku xml
do kontrolki DataGridView.
Już nie będę pokazywał jak stworzyć projekt i dodać kontrolkę :).
Przejdę od razu do kodu. Jest to dosłownie 3 linijki kodu.
Ściągnąłem sobie dla wygody gdzieś z czeluści internetu przykładowy plik
xml i jego dla przykładu odczytałem.


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace XMLReader
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            DataSet ds = new DataSet();
            ds.ReadXml(@"c:\VS_ProjektyTestowe\XMLReader\XMLReader\cd_catalog.xml");
            dataGridView1.DataSource = ds.Tables[0];
        }
    }
}

Jak widać nie kłamałem:)
 No i efekt w gridzie:

I to by było na tyle:)

sobota, 29 listopada 2014

Zegarek Binarny (Binary Watch)

Witajcie!
Dzisiaj chciałbym pokazać mały programik jakim jest zegarek binarny.
Zawsze chciałem taki mieć (przydało by się zrobić wersję elektroniczną) no i
troszkę czasu trzeba było poświęcić ale zegarek tyka i pokazuje binarnie
na wskaźnikach w postaci kropek pełną godzinę (24h), minuty oraz sekundy.

W programie również wyświetlana jest aktualna data lecz w zapisie
 zero-jedynkowym.

Program oczywiście nabazgrany w c# :).
Jeśli ktoś będzie chciał to po uporządkowaniu kodu przedstawię go na blogu.

Poniżej przedstawia, krótkie video prezentacji zegarka.




sobota, 22 listopada 2014

Robot dla każdego - part 3

Dzisiaj też króciutko na temat robota.

Robocik jest już autonomiczny potrafi określić drogę jazdy.
Czujnik HC-SR04, który umieściłem na serwie przekazuje dane na temat
odległości w 3 kierunkach  (prosto, prawo, lewo). Po tym robot wie w którą stronę
ma jechać.
Dodatkowo dodałem dwie krańcówki po bokach, ale przydały by się im dłuższe wąsy.
Jako że płytka STM32F4 Discovery ma 4 diody użytkownika, to kiedy robot bada drogę
to wszystkie świecą na raz, a kiedy jedzie w wybranym kierunku świeci się dioda
odpowiednio jedna dioda.
Pod spodem filmik prezentujący jazdę robota w ograniczonym terenie.



W ostatniej części zamieszczę cały projekt w CooCox-ie. Więc, każdy będzie
mógł sobie wgrać wsad do swojej robota, ewentualnie dostosować do swoich potrzeb.

środa, 12 listopada 2014

Robot - dla każdego part2

Witam!
Wstępne testy robota się powiodły, więc pod spodem zamieszczam filmik z jego pierwszej jazdy.
Nie jest to jeszcze ostateczny soft, który będzie w nim zaimplementowany. Docelowo będzie
badał obszar przed sobą i wybierał drogę po której ma jechać. Dlatego czujnik HC-SR04 jest
umieszczony na servie, które będzie sterowane w trzech kierunkach.


sobota, 8 listopada 2014

Robot - dla każdego!

Witajcie!
Na pewno każdy z nas zawsze marzył o zbudowaniu własnego robota.
Dzisiaj napiszę jedynie wstęp o tym jak zbudować własnego robota, który może
być sterowany bezprzewodowo.
Chociaż mój na tą chwile jest jeszcze w częściach i nawet nie ma sterowania bezprzewodowo
tylko przez UART to jednak chciałem się z wami podzielić tym co na tą chwile
zostało zrobione.

Jako podwozie użyłem zwykłego laminatu akurat dwustronny się poniewierał więc
zrobiłem z niego użytek.
Do napędu robota są użyte serwa SG90 przerobione na silniki czyli wywalona
blokada i odpięty potencjometr. Jako że posiadam drukarkę 3D to koła sobie wydrukowałem i uchwyty trzymające serwa. Wy możecie użyć kół od zabawki a uchwyty zrobić
np ze zlutowanego laminatu i będzie też trzymać. A jeśli nie to wykorzystać kawałki
blaszek i odpowiednio pozaginać i przykręcić do podwozia.
Robot będę zasilał z akumulatorków, do tego przygotowałem właśnie kopertę
na 4 akumulatorki. Szału nie będzie i wiadomo że długo one nie wytrzymają. Ale
nie mam na tą chwile żadnego pakietu li-pol.
Driver L298N do silników kupiłem za 20zł na alle.... więc tanio
Cały robot będzie sterowany z STM32F4 discovery akurat mam pod ręką. Wy
możecie użyć jakiejkolwiek płytki i procka bądź w ramach ćwiczeń projektowych
zaprojektować w eaglu coś dla siebie.

Koszty:
- dwa serwa SG90 - około 22zł  - ja akurat miałem.
- Driver L298N - też około 20zł to już nawet z przesyłką (cała płytka wraz z radiatorem)
- koperta na akumulatorki - około 2zł


Aha docelowo robot będzie miał czujnik HC-SR04 (8zł) i może coś jeszcze wymyśle :)

Kiedy  będzie w pełni gotowy to przedstawię cały soft do płytki jak również apke na PC
z której go będę sterował.




piątek, 5 września 2014

C# - Bindowanie danych do DataGridView

Witajcie
Dzisiaj króciutko pokażemy sobie jak bindować dane do kontrolki DataGridView.
Więc do dzieła.

Tworzymy nowy projekt WinFormsowy i dodajemy jeden button i kontrolkę
DataGridView z sekcji Data paska ToolBar.


Całość powinna wyglądać mniej więcej tak.

Teraz utworzymy klasę Person w której zdefiniujemy kilka właściwości określające
cechy osoby.
PPM klikamy na projekt i dodajemy  klasę, którą nazywamy Person.
W klasie definiujemy trzy właściwości:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DataGridView_Test
{
    public class Person
    {
        public int ID { get; set; }
        public string Imie { get; set; }
        public string Nazwisko { get; set; }
    }
}

Jak widzimy kodu bardzo mało - i generalnie o to nam chodzi.

Teraz dodajemy jeszcze jedną klasę, w której stworzymy listę osób oraz jedną
metodę. Klasę nazwiemy przykładowo "BindingClass".

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DataGridView_Test
{
    public class BindingClass
    {
        //lista osób
        private List person = new List
        {   new Person { ID = 1, Imie = "Wilie", Nazwisko = "Coyote"},
            new Person { ID = 2, Imie = "Road", Nazwisko = "Runner"},
            new Person { ID = 3, Imie = "Marysia", Nazwisko = "Sierotka"}
        };

        /// 
        /// Metoda zwraca listę osób z kolekcji person
        /// 
        /// 
        public List ListaDanych()
        {
            List list = new List();
            foreach (var osoba in person)
            {
                list.Add(osoba);
            }
            return list; 
        }
    }
}
Teraz pozostaje nam tylko zbindować dane z kontrolką DataGridView.

Przechodzimy do zdarzenia buttona i tutaj napiszemy 3 linijki kodu, które nam załatwią
bindowanie danych.

private void button1_Click(object sender, EventArgs e)
        {
            BindingClass dane = new BindingClass();


            BindingList bindingLista = new BindingList(dane.ListaDanych());

            dataGridView1.DataSource = bindingLista;
        }

Najpierw tworzymy obiekt "dane" klasy BindingClass, następnie tworzymy binding-listę
i jako argument przekazujemy metodę ListaDanych klasy Bindingdata, która nam zwraca
kolekcję osób. Teraz zostało tylko do kontrolki DataGridView przypisać nasze dane
i to wszystko :).
Tym samym sposobem oddzieliliśmy warstwę interfejsu użytkownika od danych.
Całość wygląda mniej więcej tak:


Zachęcam do własnych testów.
I to było by na tyle w dzisiejszym wpisie. Powodzenia.

niedziela, 24 sierpnia 2014

Regex Tester - wyrażenia regularne C#

Witajcie!

Chyba jak każdy programista czy to procesorów czy aplikacji na PC przyszło mi się
zmierzyć z prawidłowym wyłuskaniem danych z dokumentu tekstowego (excel, txt itp), ale
także z parsowaniem nadlatujących danych z procka.

I tutaj jeśli chodzi o procesory to sprawa jest trudniejsza ponieważ nie wiemy dokładnie
jakie dane nam nadlecą, czy wystąpią błędy w transmisji, czy ramka będzie cała, a w
komunikacji bezprzewodowej to już całkiem może być różnie.

Ja miałem problemy z komunikacją po RS485 w swoim robocie gdzie ogrom danych
był wysyłany z czujników jak również były wysyłane komendy sterujące pracą robota
(robot przemysłowy) i tutaj często zamiast poprawnych danych dostawałem
dziwne litery w ciągu cyfr.
Wiadomo można zaimplementować sprawdzenie danych CRC itp, ale można też w inny
sposób i ten sposób chciałbym omówić.

Wyjściem z tej trudnej sytuacji może być zaimplementowanie w naszym programie klasy Regex.
Regex przeszukuje łańcuchy znakowe w oparciu o określona strukturę czyli maskę.
Jednym słowem jeśli na wejście podamy łańcuch tekstowy to regex w oparciu o maskę
przefiltruje tekst i wypluje na wyjście tylko to co potrzebujemy.

Na nasze potrzeby napisałem program który pokaże to o czym napisałem powyżej.


Program jest bardzo porosty i intuicyjny. W pierwszym polu tekstowym wpisujemy
ciąg tekstowy do sprawdzenia czy wyłuskania danych. W drugim polu tekstowym 
piszemy naszą maskę względem której program przefiltruje tekst, a w ostatnim polu 
dostajemy nasz wynik końcowy. 

Ok to teraz przykład:
Powiedzmy, że zrobiliśmy komunikacje z naszym urządzeniem i z procesora dostajemy
dane takiej treści - 4598;1267;100 
Są to np: dane z czujników i enkodera (tak dla przykładu tylko) i teraz powiedzmy, że
komunikacja coś szwankuje i dostajemy w naszym ciągu coś takiego 45q8;1267;100.
Jeśli robimy jakiś wykres w naszym programie to dostaniemy bzdury lub program się 
nam wysypie podczas parsowania, że otrzymany ciąg nie jest liczbą i co teraz?
Teraz to się tylko załamać i wywalić kompa przez okno - heh żarcik!

Teraz to skorzystamy z naszego testera masek i zrobimy taką maskę, że wszelkie 
inne dane których nie chcemy to nie dostaniemy:) - proste!


W pierwszym polu wpisaliśmy nasze dane, w drugim zaś naszą maskę po której ma fitrować
dane przychodzące z procesora. W trzecim polu tekstowym otrzymaliśmy komunikat o 
pasujących dopasowaniach (czyli maska jest poprawna) i co najlepsze to jeszcze pogrupowane
dane czyli cóż więcej chcieć:).

Ale ktoś zapyta co to za ślaczki wpisał gościu i gada, że to działa - heh już tłumaczę.
- ^ - daszek oznacza że zaczynamy przeszukiwać wyrażenie od początku wiersza
- \d - dopasowujemy dowolną cyfrę dziesiętną {1,} a tutaj ile ma być występień tych cyfr
         czyli więcej niż jedna, można napisać np: {4} i tylko dopasuje nam 4 cyfry ni mniej 
         ni więcej
-; - czyli w ciągu musi po cyfrach wystąpić znak średnika

Dalej maska się powtarza. Więc proste:)

Jak wspomniałem wcześniej możemy takimi maskami odfiltrować całe skoroszyty excela z danych
bardzo szybko i wyłuskać tylko takie jakie nas interesują.
Zastanówcie się ile trzeba było by pisać kodu jeśli trzeba było by robić if-y splity itp.

Link do programu.

Zachęcam do testowania i implementacji regexa w swoich aplikacjach