diff --git a/Readme.md b/Readme.md index 098daf1..eb4913d 100644 --- a/Readme.md +++ b/Readme.md @@ -26,3 +26,13 @@ Good C++ guide: https://www.youtube.com/watch?v=PakbXnLht1I +#TODO ASAP : +Define a standart header for each code. +Define if we make 2 Standart error function leting us chose to kill or keep the code alive according to the error. + +#Next Step : +Code SPI comminucation interface. +Change name organise and make a new Git rep or rename this one. +Prepare evrything for Doxygen. +Start With Cmake. +Sirts Implementation on STM MCU. diff --git a/developpment/interfacer.cpp b/developpment/interfacer.cpp index 1103570..e8cc74b 100644 --- a/developpment/interfacer.cpp +++ b/developpment/interfacer.cpp @@ -45,10 +45,11 @@ int initPlatform() { lcd_init(&i2c); Gpio gpio; - //gpio.setFunction(17,Gpio::gpio); - //gpio.setMode(17,Gpio::output); +// gpio.setFunction(17,Gpio::gpio); +//k gpio.setMode(17,Gpio::output); //gpio.writePin(17,1); - //gpio.pinUninitiate(17); + gpio.pinUninitiate(17); + gpio.pinList(); return 0; } diff --git a/developpment/periferals/gpio/gpio.cpp b/developpment/periferals/gpio/gpio.cpp index c31eed3..a916a4d 100644 --- a/developpment/periferals/gpio/gpio.cpp +++ b/developpment/periferals/gpio/gpio.cpp @@ -2,6 +2,7 @@ #include "../../systems/systemCall.h" #include <fstream> +#include <iostream> #define PIN_COUNT 26 @@ -13,6 +14,7 @@ class Gpio::gpioImpl uint8_t currentPin = 0; int ck = 0; + std::ifstream bufFile; pinDefinition pins[PIN_COUNT + 1]; @@ -78,7 +80,7 @@ class Gpio::gpioImpl break; case alternate: default : - throwError(notValidMode); + throwError(__LINE__,notValidMode); break; } @@ -124,7 +126,7 @@ class Gpio::gpioImpl } else { - throwError(notValidOut); + throwError(__LINE__,notValidOut); } } @@ -142,7 +144,7 @@ class Gpio::gpioImpl void pinInitiate(uint8_t gpioNo) { - if(gpioNo < PIN_COUNT) + if(gpioNo <= PIN_COUNT) { sprintf(buffer,"[ -d /sys/class/gpio/gpio%d ]",gpioNo); // retunrs null if directory exists ck = system(buffer); @@ -159,13 +161,13 @@ class Gpio::gpioImpl } else { - throwError(pinOutOfRange); + throwError(__LINE__,pinOutOfRange); } } void pinUninitiate(uint8_t gpioNo) { - if(gpioNo < PIN_COUNT) + if(gpioNo <= PIN_COUNT) { sprintf(buffer,"[ -d /sys/class/gpio/gpio%d ]",gpioNo); // retunrs null if directory exists ck = system(buffer); @@ -176,18 +178,19 @@ class Gpio::gpioImpl } else { - throwError(pinNotDeclared); + throwError(__LINE__,pinNotDeclared); } } else { - throwError(pinOutOfRange); + throwError(__LINE__,pinOutOfRange); } } void checkCurrentPins() { uint8_t i = 0; + for( i = 0; i < PIN_COUNT; i++) { sprintf(buffer,"[ -d /sys/class/gpio/gpio%d ]",i); // retunrs null if directory exists @@ -195,11 +198,60 @@ class Gpio::gpioImpl if( ck == 0) { std::cout << "Pin: "<< unsigned(i) << " Exists "; + sprintf(buffer,"/sys/class/gpio/gpio%d/direction",i); // retunrs null if directory exists + bufFile.open(buffer,std::ios::in); + // Reads what is wirtten to define the direction of the pin + if(bufFile.is_open()) + { + bufFile.read(buffer,3); + + if(buffer[0] == 'i') + { + if (buffer[1] == 'n') + { + pins[i].mode = input; // init of the direction and the rest as a stanard gpio pin. + pins[i].state = openDrain; + pins[i].pud = none; + pins[i].speed = normal; + pins[i].interrupt = disabled; + pins[i].function = gpio; + } + } + else if (buffer[0] == 'o') + { + if(buffer[1] == 'u') + { + if(buffer[2] == 't') + { + pins[i].mode = output; + pins[i].state = openDrain; + pins[i].pud = none; + pins[i].speed = normal; + pins[i].interrupt = disabled; + pins[i].function = gpio; + } + } + } + } + } + } + } + + void pinList() // Lists allthe pins whom their mode in not set to undefined. + { + uint8_t i = 0; + + for(i = 0; i < PIN_COUNT; i++) + { + if(pins[i].mode != undefined) + { + std::cout << "|Pin "<< unsigned(i) <<" already exists and will be initialized as default GPIO|" << std::endl; + pinPrintInfo(i); } } } - void pinPrintInfo(uint8_t gpioNo) + void pinPrintInfo(uint8_t gpioNo) // a graphical arrangement to see the cunnrently acive pins { std::cout << "Pin No: " << unsigned(gpioNo); switch(pins[gpioNo].mode) @@ -317,11 +369,52 @@ class Gpio::gpioImpl std::cout << "|" << std::endl; } - void throwError(Gpio::errors errNo) + void throwError(uint16_t line, Gpio::errors errNo) { - std::cout << "Error >>GPIO.C<< No >>"<< errNo <<"<<"<< std::endl; - } + std::cout << "Error GPIO.C | Code Line: "<< unsigned(line) << " | Error No: "<< errNo << " | Description: "; + switch(errNo) + { + + case notValidMode: + std::cout << "notValidMode"; + break; + case notValidOut: + std::cout << "notValidOut"; + break; + case pinOutOfRange: + std::cout << "pinOutOfRange"; + break; + case pinNotDeclared: + std::cout << "pinNotDeclared"; + break; + case pinNotReachable: + std::cout << "pinNotReachable"; + break; + case pinNoPullUpDown: + std::cout << "pinNoPullUpDown"; + break; + case pinNotAnalog: + std::cout << "pinNotAnalog"; + break; + case pinNotDigital: + std::cout << "pinNotDigital"; + break; + case pinTooFast: + std::cout << "pinTooFast"; + break; + case pinBocked: + std::cout << "pinBocked"; + break; + case pinAlreadyUsed: + std::cout << "pinAlreadyUsed"; + break; + default: + std::cout << "Unhandled Error"; + break; + } + std::cout << " |" << std::endl; + } }; Gpio::Gpio():gpioPimpl(new gpioImpl()){} @@ -392,13 +485,17 @@ void Gpio::checkCurrentPins() return gpioPimpl->checkCurrentPins(); } +void Gpio::pinList() +{ + return gpioPimpl->pinList(); +} + void Gpio::pinPrintInfo(uint8_t gpioNo) { return gpioPimpl->pinPrintInfo(gpioNo); } -void Gpio::throwError(Gpio::errors error) +void Gpio::throwError(uint16_t line, Gpio::errors error) { - return gpioPimpl->throwError(error); + return gpioPimpl->throwError(line, error); } - diff --git a/developpment/periferals/gpio/gpio.hpp b/developpment/periferals/gpio/gpio.hpp index 78c53ab..996f0ce 100644 --- a/developpment/periferals/gpio/gpio.hpp +++ b/developpment/periferals/gpio/gpio.hpp @@ -107,10 +107,11 @@ class Gpio void pinUninitiate(uint8_t gpioNo); void checkCurrentPins(); + void pinList(); void pinPrintInfo(uint8_t gpioNo); private: - void throwError(errors errNo); + void throwError(uint16_t line, errors errNo); class gpioImpl; std::unique_ptr<gpioImpl> gpioPimpl; }; diff --git a/developpment/runtest b/developpment/runtest index 0ddd734..4414fef 100755 Binary files a/developpment/runtest and b/developpment/runtest differ