From 897f6696828bf058b066fe8da2bd5ccf48bdef09 Mon Sep 17 00:00:00 2001 From: atomega Date: Tue, 16 Mar 2021 21:43:17 +0000 Subject: [PATCH] Implement class passing as agrument & i2c.hpp template need to be revisited it doesn't compile --- developpment/Makefile | 2 +- developpment/drivers/bh1750/bh1750.cpp | 14 +- developpment/drivers/bh1750/bh1750.h | 3 +- developpment/drivers/bh1750/bh1750.o | Bin 3968 -> 3776 bytes developpment/drivers/pf8574/pf8574lcd.c | 135 ++++++++++++++++++ developpment/drivers/pf8574/pf8574lcd.h | 80 +++++++++++ developpment/drivers/pf8574/pf8574lcd.o | Bin 0 -> 3840 bytes developpment/interfacer.cpp | 17 ++- developpment/interfacer.o | Bin 25368 -> 25712 bytes developpment/runtest | Bin 47544 -> 48252 bytes training/cpp/Makefile | 22 +++ training/cpp/drivers/bh1750/bh1750.cpp | 61 ++++++++ training/cpp/drivers/bh1750/bh1750.h | 50 +++++++ training/cpp/drivers/bh1750/bh1750.o | Bin 0 -> 3776 bytes training/cpp/drivers/bh1750/bh1750.py | 69 +++++++++ training/cpp/drivers/pf8574/pf8574lcd.c | 135 ++++++++++++++++++ training/cpp/drivers/pf8574/pf8574lcd.h | 80 +++++++++++ training/cpp/drivers/pf8574/pf8574lcd.o | Bin 0 -> 3840 bytes training/cpp/interfacer.cpp | 62 ++++++++ training/cpp/interfacer.o | Bin 0 -> 25712 bytes training/cpp/management/commandManager.cpp | 97 +++++++++++++ training/cpp/management/commandManager.h | 53 +++++++ training/cpp/management/commandManager.o | Bin 0 -> 23436 bytes training/cpp/management/errorHandling.cpp | 58 ++++++++ training/cpp/management/errorHandling.h | 41 ++++++ training/cpp/management/errorHandling.o | Bin 0 -> 7116 bytes training/cpp/periferals/i2c/i2c.hpp | 96 +++++++++++++ training/cpp/periferals/i2c/i2c_ch0_pImpL.cpp | 106 ++++++++++++++ training/cpp/periferals/i2c/i2c_ch0_pImpL.h | 32 +++++ training/cpp/periferals/i2c/i2c_ch0_pImpL.o | Bin 0 -> 5288 bytes training/cpp/periferals/i2c/i2c_ch1_pImpL.cpp | 106 ++++++++++++++ training/cpp/periferals/i2c/i2c_ch1_pImpL.hpp | 32 +++++ training/cpp/periferals/i2c/i2c_ch1_pImpL.o | Bin 0 -> 5288 bytes training/cpp/periferals/i2c/i2c_driver.cpp | 106 ++++++++++++++ training/cpp/periferals/i2c/i2c_driver.h | 28 ++++ training/cpp/periferals/i2c/i2c_driver.o | Bin 0 -> 5280 bytes training/cpp/runtest | Bin 0 -> 48252 bytes training/cpp/systems/systemCall.cpp | 15 ++ training/cpp/systems/systemCall.h | 14 ++ training/cpp/systems/systemCall.o | Bin 0 -> 27828 bytes 40 files changed, 1498 insertions(+), 16 deletions(-) create mode 100755 developpment/drivers/pf8574/pf8574lcd.c create mode 100755 developpment/drivers/pf8574/pf8574lcd.h create mode 100644 developpment/drivers/pf8574/pf8574lcd.o create mode 100644 training/cpp/Makefile create mode 100644 training/cpp/drivers/bh1750/bh1750.cpp create mode 100644 training/cpp/drivers/bh1750/bh1750.h create mode 100644 training/cpp/drivers/bh1750/bh1750.o create mode 100644 training/cpp/drivers/bh1750/bh1750.py create mode 100755 training/cpp/drivers/pf8574/pf8574lcd.c create mode 100755 training/cpp/drivers/pf8574/pf8574lcd.h create mode 100644 training/cpp/drivers/pf8574/pf8574lcd.o create mode 100644 training/cpp/interfacer.cpp create mode 100644 training/cpp/interfacer.o create mode 100644 training/cpp/management/commandManager.cpp create mode 100644 training/cpp/management/commandManager.h create mode 100644 training/cpp/management/commandManager.o create mode 100644 training/cpp/management/errorHandling.cpp create mode 100644 training/cpp/management/errorHandling.h create mode 100644 training/cpp/management/errorHandling.o create mode 100644 training/cpp/periferals/i2c/i2c.hpp create mode 100644 training/cpp/periferals/i2c/i2c_ch0_pImpL.cpp create mode 100644 training/cpp/periferals/i2c/i2c_ch0_pImpL.h create mode 100644 training/cpp/periferals/i2c/i2c_ch0_pImpL.o create mode 100644 training/cpp/periferals/i2c/i2c_ch1_pImpL.cpp create mode 100644 training/cpp/periferals/i2c/i2c_ch1_pImpL.hpp create mode 100644 training/cpp/periferals/i2c/i2c_ch1_pImpL.o create mode 100644 training/cpp/periferals/i2c/i2c_driver.cpp create mode 100644 training/cpp/periferals/i2c/i2c_driver.h create mode 100644 training/cpp/periferals/i2c/i2c_driver.o create mode 100755 training/cpp/runtest create mode 100644 training/cpp/systems/systemCall.cpp create mode 100644 training/cpp/systems/systemCall.h create mode 100644 training/cpp/systems/systemCall.o diff --git a/developpment/Makefile b/developpment/Makefile index 9849f39..df753da 100644 --- a/developpment/Makefile +++ b/developpment/Makefile @@ -1,6 +1,6 @@ cpp_src = $(wildcard *.cpp) $(wildcard ./drivers/bh1750/*.cpp) $(wildcard ./management/*.cpp) $(wildcard ./systems/*.cpp) $(wildcard ./periferals/i2c/*.cpp) -#c_src = $(wildcard ../c/algorithms/*.c) $(wildcard driver/ma120x0/*.c) +c_src = $(wildcard ./drivers/pf8574/*.c) cpp_obj = $(cpp_src:.cpp=.o) c_obj = $(c_src:.c=.o) diff --git a/developpment/drivers/bh1750/bh1750.cpp b/developpment/drivers/bh1750/bh1750.cpp index 536514c..83fb57c 100644 --- a/developpment/drivers/bh1750/bh1750.cpp +++ b/developpment/drivers/bh1750/bh1750.cpp @@ -1,28 +1,28 @@ #include "bh1750.h" -i2c_ch1_pImpL i2c(1); -Bh1750::Bh1750() +Bh1750::Bh1750(i2c_ch1_pImpL *i2c) { + i2c_bh1750 = i2c; currentMode = 0; // no mode selected } uint8_t Bh1750::sleep() { - i2c.writeByte(BH1750_ADDR,BH1750_POWER_DOWN); + i2c_bh1750->writeByte(BH1750_ADDR,BH1750_POWER_DOWN); return 0; } uint8_t Bh1750::wake() { - i2c.writeByte(BH1750_ADDR,BH1750_POWER_ON); + i2c_bh1750->writeByte(BH1750_ADDR,BH1750_POWER_ON); return 0; } uint8_t Bh1750::reset() { - i2c.writeByte(BH1750_ADDR,BH1750_RESET); + i2c_bh1750->writeByte(BH1750_ADDR,BH1750_RESET); return 0; } @@ -35,7 +35,7 @@ float Bh1750::oneShot(uint8_t mode) mode == BH1750_ONE_TIME_HIGH_RES_MODE_2 || mode == BH1750_ONE_TIME_LOW_RES_MODE) { - return i2c.readWord(BH1750_ADDR,mode) / 1.2 ; + return i2c_bh1750->readWord(BH1750_ADDR,mode) / 1.2 ; } } @@ -52,7 +52,7 @@ float Bh1750::continious(uint8_t mode, uint8_t delayMs) mode == BH1750_CONTINUOUS_HIGH_RES_MODE_2 || mode == BH1750_CONTINUOUS_LOW_RES_MODE) { - return i2c.readWord(BH1750_ADDR,mode) / 1.2; + return i2c_bh1750->readWord(BH1750_ADDR,mode) / 1.2; } } std::cout<< "please seelct a continious mode "<< std::endl; diff --git a/developpment/drivers/bh1750/bh1750.h b/developpment/drivers/bh1750/bh1750.h index 043dbac..ffab7c3 100644 --- a/developpment/drivers/bh1750/bh1750.h +++ b/developpment/drivers/bh1750/bh1750.h @@ -33,13 +33,14 @@ class Bh1750 { public: - Bh1750(); + Bh1750(i2c_ch1_pImpL *i2c); uint8_t sleep(); // To be testes uint8_t wake(); // To be tested uint8_t reset(); // To be tested float oneShot(uint8_t mode); // ok float continious(uint8_t mode, uint8_t delayMs); // IMplment delay or make a delay class ??? private: + i2c_ch1_pImpL* i2c_bh1750; uint8_t high; uint8_t low; uint8_t currentMode; diff --git a/developpment/drivers/bh1750/bh1750.o b/developpment/drivers/bh1750/bh1750.o index 44efbf216387b6b9e91ef441b2bf868aa7e0fc61..93f71e798b2645337c457413a270f5c2fc11df0a 100644 GIT binary patch delta 1375 zcmbVLOGs2<6h8l*hokfG`pPjUyfM~QQ@U3z=^;*qWcfgG*JcuDp=2Ob5F$+UAfW{1 zZ{3X4BB+H@L5mhHqD8bY+7z_VnTB2uj9RBy&()Mk8IZHBaKmQPwT?Vcaf>s2JkkeM(Cv|bb>(=H%R%B}XM9F$y} zU#)8EY5C$@oK2}K{VA2anL?TPKUvY=W%8J)6V-A=gv|ia&iu=Gwld7-%FedAwe^jR zGCWvDZoz_v)5VzAhn+TPiHt(SYc6mt+bx7x2;Eg_I;v%#BP7=3xZ|D~$+n&W zVsu);3Gxv{^}vrnzW<3r1eb!c)0r-VV=+NaOGVOj#p4{c&29H$fn|cO0=buM!pbMn zGsij4cjWkuERO*d+{Lqb9CnuP=K5eBe@awt1wwfOLoT>S;}Jy4AxQz*A~?+X!+uYe zS8R_*q$1W)zz4v2O}YBB;JmIJzW~l_d!6k!10QCug&RJ!16GuIx`1C&tkib?XF-0m zfFD9V@05q&FEm`BKWFh;yD48dm0tk=rtI{*JrX@LaPat;*>S))(b_#|wvD%rMn}iY z=;W#MlYNwzHUG#yHjAf)d|9$5ei7|MVWQ_*bYd>%(~J#7_Zb`U8#6Ycj&UE+JD`Gx z`hl^TXqB;rXb|JE?lL2EGmOy9F+%qM$ht?2&2*9$*@5sg7wjkc#c1GBg88&RMg1RzE`4MR{6uOSP9Xh?DU7lgdFkft_jG6oVECpUl+^r zybenh+F`PIptmF4!IgoMNEDV=q-0Jk%3mFxLv~m dwcZ^5!i4a)y(l6|$nMgx>$aEZmRxXF{07X_1SJ3f delta 1606 zcmb7ET}V@57=FLAO{d%JEF>)_P8Oarq%)m={ZRPFM3c%2vWqF+C{!4T7!;GhkRot= zU34M2=%z~{gopy6E-VU!gu=URE{wV;x(XtD-g9=wVG!gC-+9jS{yg9Nz58}ns%L8E zgW^-7Rx5GqRapuqGfHAai-+`NrbzG063_*71^d$AX@{CjskE5=v%US5V-8BDoNIk) zntQoLY|(}<&ZT>4b?sDIB~RAU5j)fA{ijgz&V)#w7D2H`UK62!k7ytF!{_niJV4_- z=Wrf5rv&A?(7jED{XD^Ek*X3wZMX7&wLW{TF8xYXZ@KEps+g;w!OSjfUyk>a!NsgX zgDDSqTW*vQ_#*0J_CSv3$CYa_AR8PNuBg#eN-1|ERZudsAx9jK!#cZR(^y`t6|71u zw;GYI2=8H<8Gm6>=x}_+ z#<>?KZ(*1j=bkLi@n<%U`nb`oJz)+_TbwuGLs)z^$7g^F8el=M0}sQ@4TCnm3_tS# z(8_PK#qo>x6kUk(Wc--Qsv%>}Za3sV7VyvDJXg-=_^(`?LB*=hpUvbEaGsx)-vhp4 z;}^j(pSZCx3tlY{NEGll1^iNeHs*#K1@X-SUW0tT9BXKT_iH!mkAlJY1ZN5ahYR?1 zJIDKNxm^6AcD!+vVnYKh9b@6vX1%kqd&*A3-BV9rxo?Pyp@DD{Qe&fI;n+m)m5Kh& zaQE51F?qaHi_+H|F1SobMO&F<{^@(LAG$Yr+^t9b+Tr4CK7m zj4q;8#wMb7j1i(XbkFsC!hjwpn&1}*Ofy1Y9>@as86oh15dsU05LgEWT8K6oTZw)% zwqcC8Uy75coUt8$OvWRKF+z{69=UECk~k#mJuy)u?|9ydWAeN=hj9xa7ASbuFJBdjGy5$tziLO mEkOm}CE`XvjUT-P2zTE4(b_{fTNbM9#~ TOTAL_CHAR_CAP) + { + printf("LCD.C :\t La phrase est trop longue => %d MAX: %d \n", S_length, TOTAL_CHAR_CAP); + exit(1); + } + else + { + strcpy(buf, charvalue); + S_length = strlen(buf); + + #ifdef LCD_DEBUG + printf("LCD.C :\t Longeure de la prhase => %d \n", S_length); + printf("LCD.C :\t Ligne selectionee => %d \n", line); + #endif + + if(line == 1) // Selection de la ligne d'écriture + { + setPosition = pos; + } + else if(line ==2) + { + setPosition = 0x40 + pos; + } + else if(line ==3) + { + setPosition = 0x14 + pos; + } + else if(line ==4) + { + setPosition = 0x54 + pos; + } + else + { + setPosition = -1; + } + + if(setPosition >= 0) + { + lcd_write(LCD_SETDDRAMADDR + setPosition, CMD_MODE); + + for(i = 0; i < S_length; i++ ) + { + lcd_write(buf[i],RS); + } + + #ifdef LCD_DEBUG + printf("LCD.C :\t Ectiture reussit => %s \n", buf); + #endif + } + else + { + printf("LCD.C :\t Mauvais numéro de ligne => %d MAX:4 Min:1 \n", line); + exit(1); + } + } +} + +// Cette focntion nous pernet de faire pulser la ppin EN du lcd afin qu'il puisse +// enregistrer les donées qui lui sont envoyées +void ldc_pulse_En(char data) +{ + + i2c_pf8574->writeByte(LCD_ADDRS,data | EN | LCD_BACKLIGHT); + usleep(100); + i2c_pf8574->writeByte(LCD_ADDRS,((data & ~EN) | LCD_BACKLIGHT)); + usleep(500); +} + +// Cette fonction nous permet d'envoyer un information de 8 bits sous format +// de 2x4 bites. Celà est necessaire du au fonctionnement de l'expendeur de port PCF8574 +// qui est branché sur l'écran de facon a ce qu'il communiquer en 4 bits. +void lcd_write(char cmd, char mode) +{ + lcd_write_4bits(mode | (cmd & 0xF0)); + lcd_write_4bits(mode | ((cmd << 4) & 0xF0)); +} + +// Fonction nous permettant d'nevoyer 4 bits dinformation sur le PC8574 ainsi que +// le rétroéclairage. +void lcd_write_4bits(char data) +{ + i2c_pf8574->writeByte(LCD_ADDRS,data | LCD_BACKLIGHT); + ldc_pulse_En(data); +} diff --git a/developpment/drivers/pf8574/pf8574lcd.h b/developpment/drivers/pf8574/pf8574lcd.h new file mode 100755 index 0000000..974b7cf --- /dev/null +++ b/developpment/drivers/pf8574/pf8574lcd.h @@ -0,0 +1,80 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "../../periferals/i2c/i2c_ch1_pImpL.hpp" + +//#include "i2c_ch1_pImpL.cpp" + +// commandes +#define LCD_CLEARDISPLAY 0x01 +#define LCD_RETURNHOME 0x02 +#define LCD_ENTRYMODESET 0x04 +#define LCD_DISPLAYCONTROL 0x08 +#define LCD_CURSORSHIFT 0x10 +#define LCD_FUNCTIONSET 0x20 +#define LCD_SETCGRAMADDR 0x40 +#define LCD_SETDDRAMADDR 0x80 + +// flags pour mode d'ecriture +#define LCD_ENTRYRIGHT 0x00 +#define LCD_ENTRYLEFT 0x02 +#define LCD_ENTRYSHIFTINCREMENT 0x01 +#define LCD_ENTRYSHIFTDECREMENT 0x00 + +// flags pour ecran on/off control +#define LCD_DISPLAYON 0x04 +#define LCD_DISPLAYOFF 0x00 +#define LCD_CURSORON 0x02 +#define LCD_CURSOROFF 0x00 +#define LCD_BLINKON 0x01 +#define LCD_BLINKOFF 0x00 + +// flags pour display/decalage curseurr +#define LCD_DISPLAYMOVE 0x08 +#define LCD_CURSORMOVE 0x00 +#define LCD_MOVERIGHT 0x04 +#define LCD_MOVELEFT 0x00 + +// flags pour function set +#define LCD_8BITMODE 0x10 +#define LCD_4BITMODE 0x00 +#define LCD_2LINE 0x08 +#define LCD_1LINE 0x00 +#define LCD_5x1DOTS 0x04 +#define LCD_5x8DOTS 0x00 + +//flags pour le rétroeclairage +#define LCD_BACKLIGHT 0x08 +#define LCD_NOBACKLIGHT 0x00 + +//Pins de gestion de donées. +#define EN 0x04 // Enable bit +#define RW 0x02 // Read/Write bit +#define RS 0x01 // Register select bit + + +//DIfferents mode enre commande est ecriture +#define CMD_MODE 0x00 +#define CHAR_MODE 0x01 + +//adresse I2C du controlleur pour LCD +#define LCD_ADDRS 0x27 + +//Nombre max de char sur une ligne +#define TOTAL_CHAR_CAP 20 + + +int lcd_init(i2c_ch1_pImpL* i2c); +void lcd_write_char( char charvalue); +void lcd_display_string(char line, char pos, char* charvalue); +void ldc_pulse_En(char data); +void lcd_write(char cmd, char mode); +void lcd_write_4bits(char data); + + diff --git a/developpment/drivers/pf8574/pf8574lcd.o b/developpment/drivers/pf8574/pf8574lcd.o new file mode 100644 index 0000000000000000000000000000000000000000..bca93212c6829afd2f6df586703940c443c83f37 GIT binary patch literal 3840 zcmb7GZ)jXu6+ds@B$;lecDh7en^7N)DYQ0-|5xo_GFTao?#j_$Xrk9#hnrlK{j_GijU_X&}o zO;}4?MeNtKZ#@+IcReGSmx`g@z#5GEV0ZVCV6SPPG4=l3OS;edv4@-Xou0@~dQW4$ z0`Pv+Q?zeyvz`&)5v&LOmRU;rR@ZYpn~58S-=FN4x<&ifh`YN}Q1N$nn1g*9LJs)! zbA0E3K3|#ovgd&3k~1-^%`W3}khunXb%1MF@9zvlMi07NBb_7d=FDa{vhMEu9`z*l zq>j`l+mrMjWcx8curKx_+0RGsh4zoko#}Ua&x)l{bs{Vk+$;K#vTwoi!t<2{>*PLb*|oy8wj24D zAH`POZiQB()m-iP)|bCx9j;sFPrY!G90zXxr^a{h-Mjf3bN#gH5Jk=`ES$6^SKKJ91#Z)ts~oG?)5o7}he7q31j(ri{9NCy z1!6GY&~X_aE*SfaCvs2b$Bd5~pERE`K4l!rm5t8~e=gezF7SA7^741xvBYLR);SRq ze_1jgp8~8yvOntptnM6iT-gAA7M!z7a9;TnCzO|y5Qr0>A#ow&9qGrv44HjQ^WBEL zM~2Gx!@h!Edt}P+Kz+k|Mo6ZN4A@76`8m6UlKda`(;CXonP%;;W40+~JZGI^_NU%& zV-nBVr}pnbAg+VwuuJ;?B4fV|%rlaZA#ZD322cI}oUv<1#Z1{Zus__u44JC4dkRxV z_W&dl(ZA6e&gUSebYElk=t=>*4LM3s*Y3luezN^>@-^5 zH79H}0&incCp_jhpmpO`+i}~giSl@`+HAFbnQ(z;5g)~F9C!}12W}(y7Er6{xXn5; zCp8e;K_JeV<*%JSwTzHX%{k`;GoF*|1DWQq7nS2;^%xD_TGa{9T@ROGJ3-rxb`blX zCyt}u9jDX05nv5344trDg;!Ojs0UHla5qp@J7}(Y-bGI!HvFc9P{db>yl{j5GmSb5 z=rqu-#U>KJcwu1a6Kc)V8?nE*vb1)o>PRPQ_BmWU83F67)vWWsWD3J=g)l_pb~9dkKG!0+)nsfDz*Ja z1*40lQg>rlDzzw*O1qVSQ!D2yurZQ;2@LA%3FMu?&1t(EQt?{Xulr48X|`g&a^}L< zr*Uz-YocP@7{|5NiTwz*{Ezfm_+d==bxDYAdk_6f32jw0j&HuW^9qT46aQN<@M8&6 zzj^HIVU5!iX&8IV7>q*^^DStZEcKg%ob|f`1J8R(soxnW z;1}M~hBskIW2s90xW;4q#m~tablmTV_GA6u(7JRV50D_u0h5x6SMbT^dk6U#&wSL= zhq#6h_rZOW{s6;7BC2oN__?OJQsV1hOpqb^kiLx%Y6}&>7yWPr`;_{Tr#+@|3d6XF nKpcOyKGT=*VXf(2A<8Q#`eB*`I28{L_`Qq${(u3RQosKI2csO? literal 0 HcmV?d00001 diff --git a/developpment/interfacer.cpp b/developpment/interfacer.cpp index 4f0eac6..e396442 100644 --- a/developpment/interfacer.cpp +++ b/developpment/interfacer.cpp @@ -9,24 +9,28 @@ #include #include +#include #include "./management/errorHandling.h" #include "./management/commandManager.h" -#include "./systems/systemCall.h" #include "./drivers/bh1750/bh1750.h" -//#include "i2c_ch1_pImpL.cpp" - -#include +#include "./drivers/pf8574/pf8574lcd.h" unsigned int miliSecond = 1000; ErrorHandler errorHandle; CommandManager commander; -//I2C_Driver i2cDriver(1,1); -Bh1750 lightSens; +i2c_ch1_pImpL i2c(1); + +Bh1750 lightSens(&i2c); + + int initPlatform() { + char* Msg = "hello"; + lcd_init(&i2c); + lcd_display_string(1,0,Msg); // Dev. Module initialisation "Ex i2c_init() ...." return 0; } @@ -42,7 +46,6 @@ void dummy() int main(int argc, char *argv[]) { - // Init initPlatform(); std::cout << "Main" << std::endl; diff --git a/developpment/interfacer.o b/developpment/interfacer.o index d8d613f7f6558099908d1b25d2b372ca7107526d..763439ba9b953d88dd7f97415a2e85dd0e9586de 100644 GIT binary patch delta 4415 zcmZ8j32;``6+ZWdknNAWglGc!ku2~Y{$=?WT7m;MqiJ@?3Rxiw(FO||AEWW6bB^c&DqiyOjN!-5$B(T!zbJTcB0iWjv49Rv{O{`3PvWyO zC&(JQplIlVa0(7xh@qi#Gseo!Q~#Tj7I}py^`7JmLj7l! zFs?;O6KPh`gcZ!3P*ii_MxwcCsP|+YoX}KrZZ3GYiKz=(mvwNW!|+an_0U_P*H3dg zSmq{?kA_M#6q^QxBw~YQ6L`+YSVQOXj2?td(A4RgB(Gj2S~ZW`3g>fI;S6hfx?nBS z@(!oWtcdNrean`+M>fn{q2lv@qjnAt_wC}naalSoi(iRbI#1Frz~jR+iASdDs3uat zo{{h3{ur0K3PwT|<=~lF6efH}aDysn^S-i!-lexz=N_n8SZb zDNGUf*S72(S&~{2mo1}B%ezq#J_gj}IjH5Q=Tv0(#26!}uc0d3e~s0^Nb=n0V|t4r zr6A6WaIze6#~Xgx3?k8`!o|$*-4RLDIZ=Fd6t4xBzK2ZzjZy7Sdb}6Sp2OiNgV&?@ zpQ8AwD1J7Ir_XR*(_%ml-9o`AUIIQz82<#8N-|t)45kBWisA+)85AKV>3&lPT`bXk0qMR;=PPAdEXzniui?m6hD4}Q>oKSdJU?(Y7` zraiRUaL?a^bi3hR0uR$K6HNY|!6S6k7>FC$WTy?6#Iose`iJ2%ZZ^G0|1{jo_*WF0 zhz68to@=-l@Br0B@rM)5{CgdqqNje~;3;~^@NziKp=aoWDE^hOy!r=nJt3-K%xakWFuQ$9?P$}vW)Qb8A zzattDjKSANaE79zhL0LPCJ4Xdg1vBjSt_x3VfCb=PY@lm1mQ4f^n9b28{TYqtKdvU zTa4ag^gg5S1xn@vf|!v(LCnAbV6QX`8G}QDmx&Gweuk+6`fWv1f{vmqf{PTz<02Mr z3EqT24bKw{V5S6rq^KUKafdbwE>_ekxI|Hh;HOy97<`uWd_*n+2J8}CsHj^IYk!~M z7yRHdr|M&@5=tP82p%br<9(L{(>g+P%U7m7;C<)<&}IJzz~%G_PjfkczAU|W((OY5 zoL)bw{*TN)#9k;6o}j$_m#C;uIP7-`Vzvi>I!Tf2KkdWnp?n|B3KPZ6u1tYj4BqBN zEq)h6>h&j^j>TSB{_6~1<8`3vbSk{SbPc&31raj|E;lF#$3M#iY+<&A!(WeJio$IT zOjYjpTF-XJ>7@W1xaBJoaXpO0&_w7T_fDk$f@cIQ4(~M%CR~3M*kKTTWC6v2lz^-UicVMV#?Uyvvfz4-@)E&; zk`j2#B$8?PKKOty^3OBEuTd9{6X!;Vj(NhT9UQ<_AUxaHKWprB4gW0~QS?$1$TCmY zBM_Hvzkh3YTRX6On}?lJ8|e%C)A-XuKaUpr)Hpv~n8_caHo>12I^0p@=U|afy~eAH z99~}P=RUAM@MA@ej#vCl;anao^6{Z!KVK>G=|oS;D)#YZNX0;ZiJ!ZG1;9bzIPe&7 z3vd!R0JKVc{01+%GC21oJ!+Z&1AH-mzrLQ2k+PaB)Iv=-sS$2$vT?X~f>;qg0^;M84e31DWNBYAf765w8{wR0Tc;&+ zDIhDt+W-rad4IF57IW3cbUxE;>AVPEY(};lknIKwQ@L`3qw^!&zQM+s*$q-0;a5OL zUH?Fp)Uw;K z$`LMYlaq80$l(a@2N~z%Z4P$S$B;%NoZ2qIt!#I6+AMBw$E?iaN89b>f?2poXA}J% faDm@!&x|d=Pr#l0_x9Y3V-cdy&^BGXtC#5i-g0+V delta 4098 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

(Gv@{iuMPpmynV36v{DVf- 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 LvZONLwriteByte(BH1750_ADDR,BH1750_POWER_DOWN); + return 0; +} + +uint8_t Bh1750::wake() +{ + i2c_bh1750->writeByte(BH1750_ADDR,BH1750_POWER_ON); + return 0; +} + +uint8_t Bh1750::reset() +{ + i2c_bh1750->writeByte(BH1750_ADDR,BH1750_RESET); + return 0; +} + + +float Bh1750::oneShot(uint8_t mode) +{ + if(mode > 0) + { + if( mode == BH1750_ONE_TIME_HIGH_RES_MODE_1 || + mode == BH1750_ONE_TIME_HIGH_RES_MODE_2 || + mode == BH1750_ONE_TIME_LOW_RES_MODE) + { + return i2c_bh1750->readWord(BH1750_ADDR,mode) / 1.2 ; + + } + } + std::cout<< "please seelct a one shot mode "<< std::endl; + exit(1); + return 0; +} + +float Bh1750::continious(uint8_t mode, uint8_t delayMs) +{ + if(mode > 0) + { + if( mode == BH1750_CONTINUOUS_HIGH_RES_MODE_1 || + mode == BH1750_CONTINUOUS_HIGH_RES_MODE_2 || + mode == BH1750_CONTINUOUS_LOW_RES_MODE) + { + return i2c_bh1750->readWord(BH1750_ADDR,mode) / 1.2; + } + } + std::cout<< "please seelct a continious mode "<< std::endl; + exit(1); + return 0; +} diff --git a/training/cpp/drivers/bh1750/bh1750.h b/training/cpp/drivers/bh1750/bh1750.h new file mode 100644 index 0000000..ffab7c3 --- /dev/null +++ b/training/cpp/drivers/bh1750/bh1750.h @@ -0,0 +1,50 @@ + +#ifndef _BH1750_H_ +#define _BH1750_H_ + +#include +#include +#include +#include "../../periferals/i2c/i2c_ch1_pImpL.hpp" + + +//Start measurement at 4lx resolution. Time typically 16ms. +#define BH1750_CONTINUOUS_LOW_RES_MODE 0x13 +//Start measurement at 1lx resolution. Time typically 120ms +#define BH1750_CONTINUOUS_HIGH_RES_MODE_1 0x10 +//Start measurement at 0.5lx resolution. Time typically 120ms +#define BH1750_CONTINUOUS_HIGH_RES_MODE_2 0x11 +//Start measurement at 1lx resolution. Time typically 120ms +//Device is automatically set to Power Down after measurement. +#define BH1750_ONE_TIME_HIGH_RES_MODE_1 0x20 +//Start measurement at 0.5lx resolution. Time typically 120ms +//Device is automatically set to Power Down after measurement. +#define BH1750_ONE_TIME_HIGH_RES_MODE_2 0x21 +//Start measurement at 1lx resolution. Time typically 120ms +//Device is automatically set to Power Down after measurement. +#define BH1750_ONE_TIME_LOW_RES_MODE 0x23 + +#define BH1750_POWER_DOWN 0x00 // No active state +#define BH1750_POWER_ON 0x01 // Power on +#define BH1750_RESET 0x07 // Reset data register value + +#define BH1750_ADDR 0x23 // Device Adress + +class Bh1750 +{ + public: + Bh1750(i2c_ch1_pImpL *i2c); + uint8_t sleep(); // To be testes + uint8_t wake(); // To be tested + uint8_t reset(); // To be tested + float oneShot(uint8_t mode); // ok + float continious(uint8_t mode, uint8_t delayMs); // IMplment delay or make a delay class ??? + private: + i2c_ch1_pImpL* i2c_bh1750; + uint8_t high; + uint8_t low; + uint8_t currentMode; + uint8_t currentState; +}; + +#endif // _BH1750_H_ diff --git a/training/cpp/drivers/bh1750/bh1750.o b/training/cpp/drivers/bh1750/bh1750.o new file mode 100644 index 0000000000000000000000000000000000000000..93f71e798b2645337c457413a270f5c2fc11df0a GIT binary patch literal 3776 zcmb_ePfQ$T6o0e3{3*qDX)&cOsiVb&{$aZd3x%eMw78`NT9K`q*u&S^*^!;F>}+Oc z1zHoeRwbz>P4s3A96XrlfrBOgBH;IZBHww0wOvw)Elc0~^Oy=xo< zYD@BBl_j%!?#zt@f$o?9z=U%VynZ-Hv?Sgl!T+|dxlPygvsqy?8EsCvH+UL;OoAO(Z&PH z4)ELH+{e#wNZGzE>T-xg!$U(SF6qmG(s2q`lIN4LCIL{a<&DN3;* zgtpG9adWbcc6xx)w3wr_t4n9sP6Enq(D-+J-pA^Q}E@JR@-g>a?TTX+3GLi)QQJOF#%FV2DM%ZB`? zLilnJLw-AmIni7pb-Xv3P|IcN$dh<6YmcP{%DSd%GrFY-yc?EnR#e+n^$VdJct;qX z9}r@)R1xaz>{xe7h`jcaQYqS^XsA=7Y!r2MF5?C4QHq#VY{L|aIq6RJ>60bH)Tl!N zPQ%}_6{CCVey`1X9w{BiPTO6xZ$bOtH0DK0qRG z8KQvwEox4VA)lw&hin|t_Jc$>Js!i^XZ#BDPNI*PAHo~O9FOl!=0}LW1CQWC{5|ud zL_aX^A{xi}XTMqI@SA52zZ=Zq_c1v8eaakuOU&VShxNyZ{$h>~S~K3T2p;h`^Au4l z^KQOSM2BJ17~uRN TOTAL_CHAR_CAP) + { + printf("LCD.C :\t La phrase est trop longue => %d MAX: %d \n", S_length, TOTAL_CHAR_CAP); + exit(1); + } + else + { + strcpy(buf, charvalue); + S_length = strlen(buf); + + #ifdef LCD_DEBUG + printf("LCD.C :\t Longeure de la prhase => %d \n", S_length); + printf("LCD.C :\t Ligne selectionee => %d \n", line); + #endif + + if(line == 1) // Selection de la ligne d'écriture + { + setPosition = pos; + } + else if(line ==2) + { + setPosition = 0x40 + pos; + } + else if(line ==3) + { + setPosition = 0x14 + pos; + } + else if(line ==4) + { + setPosition = 0x54 + pos; + } + else + { + setPosition = -1; + } + + if(setPosition >= 0) + { + lcd_write(LCD_SETDDRAMADDR + setPosition, CMD_MODE); + + for(i = 0; i < S_length; i++ ) + { + lcd_write(buf[i],RS); + } + + #ifdef LCD_DEBUG + printf("LCD.C :\t Ectiture reussit => %s \n", buf); + #endif + } + else + { + printf("LCD.C :\t Mauvais numéro de ligne => %d MAX:4 Min:1 \n", line); + exit(1); + } + } +} + +// Cette focntion nous pernet de faire pulser la ppin EN du lcd afin qu'il puisse +// enregistrer les donées qui lui sont envoyées +void ldc_pulse_En(char data) +{ + + i2c_pf8574->writeByte(LCD_ADDRS,data | EN | LCD_BACKLIGHT); + usleep(100); + i2c_pf8574->writeByte(LCD_ADDRS,((data & ~EN) | LCD_BACKLIGHT)); + usleep(500); +} + +// Cette fonction nous permet d'envoyer un information de 8 bits sous format +// de 2x4 bites. Celà est necessaire du au fonctionnement de l'expendeur de port PCF8574 +// qui est branché sur l'écran de facon a ce qu'il communiquer en 4 bits. +void lcd_write(char cmd, char mode) +{ + lcd_write_4bits(mode | (cmd & 0xF0)); + lcd_write_4bits(mode | ((cmd << 4) & 0xF0)); +} + +// Fonction nous permettant d'nevoyer 4 bits dinformation sur le PC8574 ainsi que +// le rétroéclairage. +void lcd_write_4bits(char data) +{ + i2c_pf8574->writeByte(LCD_ADDRS,data | LCD_BACKLIGHT); + ldc_pulse_En(data); +} diff --git a/training/cpp/drivers/pf8574/pf8574lcd.h b/training/cpp/drivers/pf8574/pf8574lcd.h new file mode 100755 index 0000000..974b7cf --- /dev/null +++ b/training/cpp/drivers/pf8574/pf8574lcd.h @@ -0,0 +1,80 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "../../periferals/i2c/i2c_ch1_pImpL.hpp" + +//#include "i2c_ch1_pImpL.cpp" + +// commandes +#define LCD_CLEARDISPLAY 0x01 +#define LCD_RETURNHOME 0x02 +#define LCD_ENTRYMODESET 0x04 +#define LCD_DISPLAYCONTROL 0x08 +#define LCD_CURSORSHIFT 0x10 +#define LCD_FUNCTIONSET 0x20 +#define LCD_SETCGRAMADDR 0x40 +#define LCD_SETDDRAMADDR 0x80 + +// flags pour mode d'ecriture +#define LCD_ENTRYRIGHT 0x00 +#define LCD_ENTRYLEFT 0x02 +#define LCD_ENTRYSHIFTINCREMENT 0x01 +#define LCD_ENTRYSHIFTDECREMENT 0x00 + +// flags pour ecran on/off control +#define LCD_DISPLAYON 0x04 +#define LCD_DISPLAYOFF 0x00 +#define LCD_CURSORON 0x02 +#define LCD_CURSOROFF 0x00 +#define LCD_BLINKON 0x01 +#define LCD_BLINKOFF 0x00 + +// flags pour display/decalage curseurr +#define LCD_DISPLAYMOVE 0x08 +#define LCD_CURSORMOVE 0x00 +#define LCD_MOVERIGHT 0x04 +#define LCD_MOVELEFT 0x00 + +// flags pour function set +#define LCD_8BITMODE 0x10 +#define LCD_4BITMODE 0x00 +#define LCD_2LINE 0x08 +#define LCD_1LINE 0x00 +#define LCD_5x1DOTS 0x04 +#define LCD_5x8DOTS 0x00 + +//flags pour le rétroeclairage +#define LCD_BACKLIGHT 0x08 +#define LCD_NOBACKLIGHT 0x00 + +//Pins de gestion de donées. +#define EN 0x04 // Enable bit +#define RW 0x02 // Read/Write bit +#define RS 0x01 // Register select bit + + +//DIfferents mode enre commande est ecriture +#define CMD_MODE 0x00 +#define CHAR_MODE 0x01 + +//adresse I2C du controlleur pour LCD +#define LCD_ADDRS 0x27 + +//Nombre max de char sur une ligne +#define TOTAL_CHAR_CAP 20 + + +int lcd_init(i2c_ch1_pImpL* i2c); +void lcd_write_char( char charvalue); +void lcd_display_string(char line, char pos, char* charvalue); +void ldc_pulse_En(char data); +void lcd_write(char cmd, char mode); +void lcd_write_4bits(char data); + + diff --git a/training/cpp/drivers/pf8574/pf8574lcd.o b/training/cpp/drivers/pf8574/pf8574lcd.o new file mode 100644 index 0000000000000000000000000000000000000000..bca93212c6829afd2f6df586703940c443c83f37 GIT binary patch literal 3840 zcmb7GZ)jXu6+ds@B$;lecDh7en^7N)DYQ0-|5xo_GFTao?#j_$Xrk9#hnrlK{j_GijU_X&}o zO;}4?MeNtKZ#@+IcReGSmx`g@z#5GEV0ZVCV6SPPG4=l3OS;edv4@-Xou0@~dQW4$ z0`Pv+Q?zeyvz`&)5v&LOmRU;rR@ZYpn~58S-=FN4x<&ifh`YN}Q1N$nn1g*9LJs)! zbA0E3K3|#ovgd&3k~1-^%`W3}khunXb%1MF@9zvlMi07NBb_7d=FDa{vhMEu9`z*l zq>j`l+mrMjWcx8curKx_+0RGsh4zoko#}Ua&x)l{bs{Vk+$;K#vTwoi!t<2{>*PLb*|oy8wj24D zAH`POZiQB()m-iP)|bCx9j;sFPrY!G90zXxr^a{h-Mjf3bN#gH5Jk=`ES$6^SKKJ91#Z)ts~oG?)5o7}he7q31j(ri{9NCy z1!6GY&~X_aE*SfaCvs2b$Bd5~pERE`K4l!rm5t8~e=gezF7SA7^741xvBYLR);SRq ze_1jgp8~8yvOntptnM6iT-gAA7M!z7a9;TnCzO|y5Qr0>A#ow&9qGrv44HjQ^WBEL zM~2Gx!@h!Edt}P+Kz+k|Mo6ZN4A@76`8m6UlKda`(;CXonP%;;W40+~JZGI^_NU%& zV-nBVr}pnbAg+VwuuJ;?B4fV|%rlaZA#ZD322cI}oUv<1#Z1{Zus__u44JC4dkRxV z_W&dl(ZA6e&gUSebYElk=t=>*4LM3s*Y3luezN^>@-^5 zH79H}0&incCp_jhpmpO`+i}~giSl@`+HAFbnQ(z;5g)~F9C!}12W}(y7Er6{xXn5; zCp8e;K_JeV<*%JSwTzHX%{k`;GoF*|1DWQq7nS2;^%xD_TGa{9T@ROGJ3-rxb`blX zCyt}u9jDX05nv5344trDg;!Ojs0UHla5qp@J7}(Y-bGI!HvFc9P{db>yl{j5GmSb5 z=rqu-#U>KJcwu1a6Kc)V8?nE*vb1)o>PRPQ_BmWU83F67)vWWsWD3J=g)l_pb~9dkKG!0+)nsfDz*Ja z1*40lQg>rlDzzw*O1qVSQ!D2yurZQ;2@LA%3FMu?&1t(EQt?{Xulr48X|`g&a^}L< zr*Uz-YocP@7{|5NiTwz*{Ezfm_+d==bxDYAdk_6f32jw0j&HuW^9qT46aQN<@M8&6 zzj^HIVU5!iX&8IV7>q*^^DStZEcKg%ob|f`1J8R(soxnW z;1}M~hBskIW2s90xW;4q#m~tablmTV_GA6u(7JRV50D_u0h5x6SMbT^dk6U#&wSL= zhq#6h_rZOW{s6;7BC2oN__?OJQsV1hOpqb^kiLx%Y6}&>7yWPr`;_{Tr#+@|3d6XF nKpcOyKGT=*VXf(2A<8Q#`eB*`I28{L_`Qq${(u3RQosKI2csO? literal 0 HcmV?d00001 diff --git a/training/cpp/interfacer.cpp b/training/cpp/interfacer.cpp new file mode 100644 index 0000000..b3ca31c --- /dev/null +++ b/training/cpp/interfacer.cpp @@ -0,0 +1,62 @@ +/* + * Authors : Kerem Yollu & Edwin Koch + * Date : 07.03.2021 + * + * Description : + * TODO : Write description or doxygene + * + */ + +#include +#include +#include +#include "./management/errorHandling.h" +#include "./management/commandManager.h" +#include "./drivers/bh1750/bh1750.h" +#include "./drivers/pf8574/pf8574lcd.h" + +unsigned int miliSecond = 1000; + + +ErrorHandler errorHandle; +CommandManager commander; +i2c_ch1_pImpL i2c(1); + +Bh1750 lightSens(&i2c); + + + +int initPlatform() +{ + char* Msg = "hello"; + lcd_init(&i2c); + lcd_display_string(1,1,Msg); + // Dev. Module initialisation "Ex i2c_init() ...." + return 0; +} + +void dummy() +{ + while(1) + { + std::cout << "value "<< lightSens.continious(BH1750_CONTINUOUS_HIGH_RES_MODE_1,1) << " Lux" <|z^8qNE8Bd8v&`y*yqXs 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 r4{g7Kah$jYbgamVmf3j5#=TXG=EG$f!aYA literal 0 HcmV?d00001 diff --git a/training/cpp/management/commandManager.cpp b/training/cpp/management/commandManager.cpp new file mode 100644 index 0000000..1df86cf --- /dev/null +++ b/training/cpp/management/commandManager.cpp @@ -0,0 +1,97 @@ +/* + * Authors : Kerem Yollu & Edwin Koch + * Date : 07.03.2021 + * + * Description : + * TODO : Inplement singleton pattern + * TODO : Write description + * TODO : Comment the code wiht odxygen + * + */ + +#include "commandManager.h" + + +CommandManager::CommandManager():emptyIndex(0) +{ +} + +void CommandManager::addNewCommand( const std::string& commmand, + const std::string& description, + commanCallback_t callBack) +{ + if(emptyIndex >= MAX_MUNBER_OF_COMMANDS) // Check if the command list is full + { + std::cout << "Error | Intern | Command list is full!" << std::endl; + exit(1); + } + if(getLookUpIndex(commmand) >= 0) // Chek for command duplicats + { + std::cout << "Error | Intern | Command already exitst!" << std::endl; + exit(1); + } + + + commandLookup[emptyIndex].commmand = commmand; + commandLookup[emptyIndex].description = description; + commandLookup[emptyIndex].callBack = callBack; + emptyIndex++; +} + +void CommandManager::operator()(const std::string cmdName) +{ + int index = 0; + + if(cmdName == "help" || cmdName == "Help") + { + printHelp(); + exit(1); + } + + if(cmdName == "-h" || cmdName == "-H") + { + printCommads(); + exit(1); + } + + index = getLookUpIndex(cmdName); + + if(index < 0) + { + std::cout << "Error | Intern | Invalid Command!" << std::endl; + exit(1); + } + + commandLookup[index].callBack(); + exit(1); +} + + +// +// Privat memeber functions +// + + +int CommandManager::getLookUpIndex(const std::string& cmd) +{ + int index = 0; + for (index = 0; index < emptyIndex; index++) + { + if(commandLookup[index].commmand == cmd) + { + return index; + } + } + return -1; +} + +void CommandManager::printHelp() +{ + std::cout << "Function : printHelp is under construction" << std::endl; +} + +void CommandManager::printCommads() +{ + std::cout << "Function : printCommads is under construction" << std::endl; +} + diff --git a/training/cpp/management/commandManager.h b/training/cpp/management/commandManager.h new file mode 100644 index 0000000..5d7eff2 --- /dev/null +++ b/training/cpp/management/commandManager.h @@ -0,0 +1,53 @@ +/* + * Authors : Kerem Yollu & Edwin Koch + * Date : 07.03.2021 + * + * Description : + * TODO : Inplement singleton pattern + * TODO : Write description + * TODO : Comment the code wiht odxygen + * + */ + + +#ifndef _COMMMANDMANAGER_H_ +#define _COMMMANDMANAGER_H_ + +#include +#include +#include +#include + +#define MAX_MUNBER_OF_COMMANDS 4 + +class CommandManager +{ + public: + typedef std::function commanCallback_t; + CommandManager(); + void addNewCommand( const std::string& commmand, + const std::string& description, + commanCallback_t callBack); + + void operator()(const std::string cmdName); + + + private: + unsigned int emptyIndex; + + struct commant_t{ + std::string commmand; + std::string description; + commanCallback_t callBack; // The Callback function could only be a void returning a void. + }; + + std::array commandLookup; + int getLookUpIndex(const std::string& cmd); // If command exists retunrs the index otherwise -1 + void printHelp(); // Prints all awailbale commands and their description. + void printCommads(); // Prints all awailable commnads without description. +}; + + + + +#endif // _COMMMANDMANAGER_H_ diff --git a/training/cpp/management/commandManager.o b/training/cpp/management/commandManager.o new file mode 100644 index 0000000000000000000000000000000000000000..c9eefcfa4aa02184388118e5dc428d6f07807555 GIT binary patch literal 23436 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 KU9iQF(ffZ{Jwp@# literal 0 HcmV?d00001 diff --git a/training/cpp/management/errorHandling.cpp b/training/cpp/management/errorHandling.cpp new file mode 100644 index 0000000..9e30a38 --- /dev/null +++ b/training/cpp/management/errorHandling.cpp @@ -0,0 +1,58 @@ +#include "errorHandling.h" + +ErrorHandler::ErrorHandler(): emptyIndex(0) +{ +} + + +void ErrorHandler::handleError(int errNo) +{ + int index = 0; + + index = getLookUpIndex(errNo); + + if(index < 0) + { + std::cout << "The given error number does not exist\n" << "Tipp: use \"addNewError(Integer, String)\""<< std::endl; + exit(1); + } + + std::cout << "Error | " << errNo << " | \"" << errorLookup[index].errMessage << "\""<= MAX_NUMBER_OF_ERRORS) // Check if list is full + { + std::cout << "Error | Ultimate | List is full" << std::endl; + exit(1); + } + + if(getLookUpIndex(no) >= 0) // Check if Error No already exists + { + std::cout << "Error | Intern | Error No: "<< no << " Exists ! PLease choose a different number !" << std::endl; + exit(1); + } + + errorLookup[emptyIndex].errNo = no; + errorLookup[emptyIndex].errMessage = message; + emptyIndex++; +} + +// +// Privat memeber functions +// + +int ErrorHandler::getLookUpIndex(int errNo) +{ + int i = 0; + for(i = 0; i < emptyIndex; i++) + { + if(errNo == errorLookup[i].errNo) + { + return i; + } + } + return -1; +} diff --git a/training/cpp/management/errorHandling.h b/training/cpp/management/errorHandling.h new file mode 100644 index 0000000..b9dbe92 --- /dev/null +++ b/training/cpp/management/errorHandling.h @@ -0,0 +1,41 @@ +/* + * Authors : Kerem Yollu & Edwin Koch + * Date : 07.03.2021 + * + * Description : + * TODO : Inplement singleton pattern + * TODO : Write description + * TODO : Comment the code wiht odxygen + * + */ + + +#ifndef _ERRORHANDLIG_H_ +#define _ERRORHANDLIG_H_ + +#include +#include +#include + +#define MAX_NUMBER_OF_ERRORS 255 + + +class ErrorHandler +{ + public: + ErrorHandler(); + void addNewError(const int& no, const std::string& message); + void handleError(int no); + private: + + struct error_t { //Struture of error entry for the errorLookup table + int errNo; + std::string errMessage; + }; + + unsigned int emptyIndex; // Indicates the next empty slot in the errorLookup table. + std::array errorLookup; // Where the errors go. + int getLookUpIndex(int errNo); // If error number exists returns the index otherwise -1 +}; + +#endif // _ERRORHANDLIG_H_ diff --git a/training/cpp/management/errorHandling.o b/training/cpp/management/errorHandling.o new file mode 100644 index 0000000000000000000000000000000000000000..5826368bc58cef7ff195f7d5f25abb058656ab29 GIT binary patch literal 7116 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 Ad;kCd literal 0 HcmV?d00001 diff --git a/training/cpp/periferals/i2c/i2c.hpp b/training/cpp/periferals/i2c/i2c.hpp new file mode 100644 index 0000000..be49920 --- /dev/null +++ b/training/cpp/periferals/i2c/i2c.hpp @@ -0,0 +1,96 @@ +#ifndef _I2C_H_ +#define _I2C_H_ + +namespace serial +{ + enum i2c_id + { + i2c_ch0, + i2c_ch1 + }; + + // + // Base template class + // + + template + class I2C + { + public: + I2C(const uint8_t& mode); // Mode : Master or Slave + uint8_t readByte(const uint8_t& address, const uint8_t& reg); + uint16_t readWord(const uint8_t& address, const uint8_t& reg); + uint8_t writeByte(const uint8_t& address, const uint8_t& data); + uint8_t writeWord(const uint8_t& address, const uint8_t& reg, const uint16_t& data); + + private: + }; + + // + // Template for channel 0 + // + template<> + class I2C + { + public: + I2C(const uint8_t& mode):pImpL(mode) + { + } + uint8_t readByte(const uint8_t& address, const uint8_t& reg) + { + return pImpL -> readByte(address, reg); + } + uint16_t readWord(const uint8_t& address, const uint8_t& reg) + { + return pImpL -> readWord(address,reg); + } + uint8_t writeByte(const uint8_t& address, const uint8_t& data) + { + return pImpL -> writeByte(address, data); + } + uint8_t writeWord(const uint8_t& address, const uint8_t& reg, const uint16_t& data) + { + return pImpL -> writeWord(address, reg, data); + } + + private: + class i2c_ch0_pImpL; + std::unique_ptr pImpL; + }; + + // + // Template for channel 1 + // + template<> + class I2C + { + public: + I2C(const uint8_t& mode):pImpL(mode) + { + } + uint8_t readByte(const uint8_t& address, const uint8_t& reg) + { + return pImpL -> readByte(address, reg); + } + uint16_t readWord(const uint8_t& address, const uint8_t& reg) + { + return pImpL -> readWord(address,reg); + } + uint8_t writeByte(const uint8_t& address, const uint8_t& data) + { + return pImpL -> writeByte(address, data); + } + uint8_t writeWord(const uint8_t& address, const uint8_t& reg, const uint16_t& data) + { + return pImpL -> writeWord(address, reg, data); + } + + private: + class i2c_ch1_pImpL; + std::unique_ptr pImpL; + }; + +}// Namespace serial + + +#endif // _I2C_H_ diff --git a/training/cpp/periferals/i2c/i2c_ch0_pImpL.cpp b/training/cpp/periferals/i2c/i2c_ch0_pImpL.cpp new file mode 100644 index 0000000..6201bc8 --- /dev/null +++ b/training/cpp/periferals/i2c/i2c_ch0_pImpL.cpp @@ -0,0 +1,106 @@ +#include "i2c_ch0_pImpL.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +#define PORT_I2C "/dev/i2c-1" + +// some curious things https://www.john.geek.nz/2012/12/update-reading-data-from-a-bosch-bmp085-with-a-raspberry-pi/ + + +i2c_ch0_pImpL::i2c_ch0_pImpL(const uint8_t& mode) +{ + char filename[20]; + snprintf(filename, 19, "/dev/i2c-%d", 0); + + deviceDescriptor = open(filename, O_RDWR); + if (deviceDescriptor < 0) { + std::cout << "unable to open : "<< deviceDescriptor << " ! quiting" << std::endl; + exit(1); + } +} + +uint8_t i2c_ch0_pImpL::writeByte(const uint8_t& address, const uint8_t& data) // retuns 0 when a sucsessful transation ocures +{ + if (ioctl(deviceDescriptor, I2C_SLAVE, address) < 0) + { + std::cout << "Unable to reach device : "<< address << " ! quiting" << std::endl; + exit(1); + } + + send_buffer[0] = data; + + if ((write(deviceDescriptor, send_buffer, 1)) != 1) + { + std::cout << "Unable to write quiting" << std::endl; + exit(0); + } + return 0; +} + +uint8_t i2c_ch0_pImpL::readByte(const uint8_t& address, const uint8_t& reg) +{ + if (ioctl(deviceDescriptor, I2C_SLAVE, address) < 0) + { + std::cout << "Unable to reach device : "<< address << " ! quiting" << std::endl; + exit(1); + } + + writeByte(address,reg); //Initiate a write to indicate the desired register to read + + if (read(deviceDescriptor, recieve_buffer, 1) != 1) // An then initare a read request of 1 byte + { + std::cout << "Unable to read quiting" << std::endl; + exit(1); + } + return recieve_buffer[0] ; +} + + +uint8_t i2c_ch0_pImpL::writeWord(const uint8_t& address, const uint8_t& reg, const uint16_t& data) // retuns 0 when a sucsessful transation ocures +{ + + if (ioctl(deviceDescriptor, I2C_SLAVE, address) < 0) + { + std::cout << "Unable to reach device : "<< address << " ! quiting" << std::endl; + exit(1); + } + + send_buffer[0] = reg; + send_buffer[1] = data; + + if ((write(deviceDescriptor, send_buffer, 2)) != 2) + { + std::cout << "Unable to write quiting" << std::endl; + exit(0); + } + return 0; +} + +uint16_t i2c_ch0_pImpL::readWord(const uint8_t& address, const uint8_t& reg) +{ + uint16_t result = 0 ; + if (ioctl(deviceDescriptor, I2C_SLAVE, address) < 0) + { + std::cout << "Unable to reach device : "<< address << " ! quiting" << std::endl; + exit(1); + } + + writeByte(address,reg); //Initiate a write to indicate the desired register to read + + if (read(deviceDescriptor, recieve_buffer, 2) != 2) // An then initare a read request of 2 bytes + { + std::cout << "Unable to read quiting" << std::endl; + exit(1); + } + result = (recieve_buffer[0] << 8) + recieve_buffer[1] ; + return result ; +} diff --git a/training/cpp/periferals/i2c/i2c_ch0_pImpL.h b/training/cpp/periferals/i2c/i2c_ch0_pImpL.h new file mode 100644 index 0000000..51fa22a --- /dev/null +++ b/training/cpp/periferals/i2c/i2c_ch0_pImpL.h @@ -0,0 +1,32 @@ +#ifndef _I2C_CH0_PIMPL_H_ +#define _I2C_CH0_PIMPL_H_ + +#include +#include +#include +#include "../../management/errorHandling.h" +#include "../../systems/systemCall.h" + +class i2c_ch0_pImpL +{ + public: + i2c_ch0_pImpL(const uint8_t& mode); // Mode : Master or Slave + uint8_t readByte(const uint8_t& address, const uint8_t& reg); + uint16_t readWord(const uint8_t& address, const uint8_t& reg); + uint8_t writeByte(const uint8_t& address, const uint8_t& data); + uint8_t writeWord(const uint8_t& address, const uint8_t& reg, const uint16_t& data); + + + private: + int16_t deviceDescriptor; + uint8_t device_address; + uint8_t device_reg; + uint8_t send_buffer[32]; + uint8_t recieve_buffer[32]; + uint8_t blocks; + uint8_t channel; + uint8_t mode; +}; + + +#endif // _I2C_CH0_PIMPL_H_ diff --git a/training/cpp/periferals/i2c/i2c_ch0_pImpL.o b/training/cpp/periferals/i2c/i2c_ch0_pImpL.o new file mode 100644 index 0000000000000000000000000000000000000000..b47e8eca17a6638bd055ba10d0b3782b8ab7a53b GIT binary patch literal 5288 zcmcgwU2Ggz8U1G0aW+4|CNW@Q3kKwXo5q{j#8^(Kgj2^&EW2rByAVO8>3DXU9c8_< z?2a1;kSHY*0fJQVghZqm@q(&6_#vtQ8BwVbibNhPg~zChooo~Yr~&1n4;AK|nLF$2 z!7eEeTx<5+bHDF?fA?ob{@%#=bB19^(hTX9HHOjMkz`AM1ii9L@**eu{?fMa(-m{+ z`4v-kG<)(pnw>JXBG&x9H_WTeJ^A^2|5{!BYo|4~l0iQ!^ULIrFE`9TJTR@U=7Rao zGVzghds$@i9^AZnCV#bgMy@s^U30!A&*tZsGn$P-=;<~OXxxz4H*Hg=Z3%H*`u#&h zE!|NLB9_7=k390oA&;HNBX90#=2TpqzY~42Za1@t=PvvtdHm|D$i;f^fr@?mO~`I) zvA5=>V*j-kE9-GZ<4Np!`ZRAxakQE5tc!=SwOKz{F-+7Iwv%`a)X=cz_rPX0i7O|v zeF*lgBrf>VYbB~yTsOT|*{veaq-u4BT&??)*6TieC-J50bqlgvNnEJyX7#$J)ra+( z*LbU5W*643tC^Fo$e+G`?Du?xdL4)T{voc_e2xw`=oSK0-|%X|-(4%dfw0mbBWjmNzt>)Up$Mup{5q z%&R@9$HPAN;FH#^4EwEn5dNk%@E6;>-E3H^53>EdS63f!Y#;8bXv}*3F6;7^_06az z$vybr_GwPL3%Lh)uWS?9%k$Z5UTtEnm$!hMs&3sF>qdO}q>kE|SY1_@NCN8q$U&cV zTjo0fcXOhrzjqFnyjKtUhupq>C7G={(-qGQ12d?3Rr9C`d* zL3>*Uq`f_7Y%{iJcDHpHpEN$5?KD1P?9Fr=pKbqwUQIgCe4*ba|5&#=+4XOI$>L9M zS%GQ*8tI$5zE^e{?yDhUuB1#lU(?|C*56b7pDDh-RZHPlrSzxx^~~A?%12W27gGGkDgH~v zllXoI&b|d?yzi#;@2B|Qlz$VP>(4kje>f#S3C{IDspJ7T*ZXC~f0ojJGsSEfDUOZCsJ=Z($H$2-7s*SKd>xQvt(6;@+ull5? zj@b6u>a6X~&5a)_+IGo%#hI;yb|rAn*|nhJyB9{3!NX1kqfQvqZKr-V9vtw`R)e}H zJq~z3<~Kqo^j(|QeW&7o8!V{WPPGKfaSY^^?~8q6{Do(ajbqB}v^{Dgl;Yua=?otl znHVceqgt!`)$kSJRUdh+G)5=GV$m%-bvvv(e%KgwM@A+vc6i!pzx=O!kDNjuK2-wkHt>hycnQf1VAG6z%klm!<9w%B%b4coKT z^FETrO4zk}kFQ*b1D9X)#?^r$ddw8anHu<}1;T$ae#2JQ#>a?_oVZ=e@P z^Yx%!QqfF|McXBnO=M2fqNT}j&<`3mmcr{F#XcA=j=b8cj}v-x+<11W5!hwyi;B0= zoa3AmzazW9g!6@dcQ4Kj@hOox;(n1!ivOJWw8%X1fC%3K8Qhz{QOJ8R(2GyAO*TSA2>HyDt%8_c9T|TvzfNN`6bpd0)`)Ln8eBP4P!W_EKyg#Vk0-y*{QlHxhO z3y+{q#G|;Iff@L=h+o0_6Q9ARK--U+M(tqyJ+l83@wW)acTx_{cMy4p;{3KF=lhm& zQ}G_fv4tbKr4S&Q&*7)gxG)ns)4;GEV>#*7y-ERxCX_9Im29dp}ftLZUZ_zOI+wy7s>gUGGG!S9_gacwW4`QoD1V7ZnQE0V9kC@b$!aLAg!bEI;`63?1m&e0clU&i2Ydb{V V)g~tPkls4I5CcEq1l1C~e**`Q&cOfx literal 0 HcmV?d00001 diff --git a/training/cpp/periferals/i2c/i2c_ch1_pImpL.cpp b/training/cpp/periferals/i2c/i2c_ch1_pImpL.cpp new file mode 100644 index 0000000..7818b65 --- /dev/null +++ b/training/cpp/periferals/i2c/i2c_ch1_pImpL.cpp @@ -0,0 +1,106 @@ +#include "i2c_ch1_pImpL.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +#define PORT_I2C "/dev/i2c-1" + +// some curious things https://www.john.geek.nz/2012/12/update-reading-data-from-a-bosch-bmp085-with-a-raspberry-pi/ + + +i2c_ch1_pImpL::i2c_ch1_pImpL(const uint8_t& mode) +{ + char filename[20]; + snprintf(filename, 19, "/dev/i2c-%d", 1); + + deviceDescriptor = open(filename, O_RDWR); + if (deviceDescriptor < 0) { + std::cout << "unable to open : "<< deviceDescriptor << " ! quiting" << std::endl; + exit(1); + } +} + +uint8_t i2c_ch1_pImpL::writeByte(const uint8_t& address, const uint8_t& data) // retuns 0 when a sucsessful transation ocures +{ + if (ioctl(deviceDescriptor, I2C_SLAVE, address) < 0) + { + std::cout << "Unable to reach device : "<< address << " ! quiting" << std::endl; + exit(1); + } + + send_buffer[0] = data; + + if ((write(deviceDescriptor, send_buffer, 1)) != 1) + { + std::cout << "Unable to write quiting" << std::endl; + exit(0); + } + return 0; +} + +uint8_t i2c_ch1_pImpL::readByte(const uint8_t& address, const uint8_t& reg) +{ + if (ioctl(deviceDescriptor, I2C_SLAVE, address) < 0) + { + std::cout << "Unable to reach device : "<< address << " ! quiting" << std::endl; + exit(1); + } + + writeByte(address,reg); //Initiate a write to indicate the desired register to read + + if (read(deviceDescriptor, recieve_buffer, 1) != 1) // An then initare a read request of 1 byte + { + std::cout << "Unable to read quiting" << std::endl; + exit(1); + } + return recieve_buffer[0] ; +} + + +uint8_t i2c_ch1_pImpL::writeWord(const uint8_t& address, const uint8_t& reg, const uint16_t& data) // retuns 0 when a sucsessful transation ocures +{ + + if (ioctl(deviceDescriptor, I2C_SLAVE, address) < 0) + { + std::cout << "Unable to reach device : "<< address << " ! quiting" << std::endl; + exit(1); + } + + send_buffer[0] = reg; + send_buffer[1] = data; + + if ((write(deviceDescriptor, send_buffer, 2)) != 2) + { + std::cout << "Unable to write quiting" << std::endl; + exit(0); + } + return 0; +} + +uint16_t i2c_ch1_pImpL::readWord(const uint8_t& address, const uint8_t& reg) +{ + uint16_t result = 0 ; + if (ioctl(deviceDescriptor, I2C_SLAVE, address) < 0) + { + std::cout << "Unable to reach device : "<< address << " ! quiting" << std::endl; + exit(1); + } + + writeByte(address,reg); //Initiate a write to indicate the desired register to read + + if (read(deviceDescriptor, recieve_buffer, 2) != 2) // An then initare a read request of 2 bytes + { + std::cout << "Unable to read quiting" << std::endl; + exit(1); + } + result = (recieve_buffer[0] << 8) + recieve_buffer[1] ; + return result ; +} diff --git a/training/cpp/periferals/i2c/i2c_ch1_pImpL.hpp b/training/cpp/periferals/i2c/i2c_ch1_pImpL.hpp new file mode 100644 index 0000000..d53d85f --- /dev/null +++ b/training/cpp/periferals/i2c/i2c_ch1_pImpL.hpp @@ -0,0 +1,32 @@ +#ifndef _I2C_CH1_PIMPL_H_ +#define _I2C_CH1_PIMPL_H_ + +#include +#include +#include +#include "../../systems/systemCall.h" +#include "../../management/errorHandling.h" + +class i2c_ch1_pImpL +{ + public: + i2c_ch1_pImpL(const uint8_t& mode); // Mode : Master or Slave + uint8_t readByte(const uint8_t& address, const uint8_t& reg); + uint16_t readWord(const uint8_t& address, const uint8_t& reg); + uint8_t writeByte(const uint8_t& address, const uint8_t& data); + uint8_t writeWord(const uint8_t& address, const uint8_t& reg, const uint16_t& data); + + + private: + int16_t deviceDescriptor; + uint8_t device_address; + uint8_t device_reg; + uint8_t send_buffer[32]; + uint8_t recieve_buffer[32]; + uint8_t blocks; + uint8_t channel; + uint8_t mode; +}; + + +#endif // _I2C_CH1_PIMPL_H_ diff --git a/training/cpp/periferals/i2c/i2c_ch1_pImpL.o b/training/cpp/periferals/i2c/i2c_ch1_pImpL.o new file mode 100644 index 0000000000000000000000000000000000000000..8402b60c4ae72f24d04fdad2f15f8636f47902e8 GIT binary patch literal 5288 zcmcgwU2Ggz8U1G0PBuTlCNW@Q3kKwXo5q{j#8^(Kgj2^&EW2rByAVO8>3DXU9c8_< z?2a1;kSHY*0fK~hLLyR(ctKSj{18=ujHpx#MIsND!edm$PBsbx)PVBPhYEAf%$@c1 z;6y18Tx<5+bHDF?fA?ob{@%#=3x;7x(hTX9b%xR1k)*vpf?nArd6AQSe{Ea%>8iQ> z;;Jb-nmzd)%}yCxHLUr&KQpg3_vGjA{(EihZ=KfIY6ktR%&(A(HNVm@|9IcDx|$2- zyDP+p)~ywh$-8j#)|vd(<{7!#jC9TUmOPuEU&&}T2BD|hJfLwyV&Ak)ownt%Rk`$s z2Z&m_qZ~vmg-ITHc0mzvq@Yz zk?ljUZzXZTpI$3bwZfcejgnerw~9QMs?`~CweC+_uY2&F#FwtuO~`I0aiO-4tJgKH zKCIWg##{9=yRdd$&75>a{`B=@zvm;=>p1N9Cvm}_wTZvjCiaB3zc#B`?FlvOupYn9 z9>M41>UJBl+ev&+sN13zH|w^b@mAeZ`>X?e0q3z{zJH%Nwm)X?Wm0=D^MBlXoj9v` zoYfBAIXJ7_yKh@#D?Bs2OSmS?BRR9VU5~HjL)7GqF(%IJcX->Nfxd(W!Y!lhb^Vw@&ZDOrg+QCg#w{DDeBffl6N9|0kt*J{S0d;@m zpwGIk@ST9WInmSKI|obN>j(WqZr{F=%vPQ0if4v_8PvS0dDMhG^YiAnX8q8wo)vky zC9ivqTQ)J(cfD9|U3R|ihhA&a`Z(s4TEjB*OXK?s3vXOx$RD-OIczuZ?8Nf{66ypV z$cpp;!?yU{^A{A5xejiL5nYiJ!^20--U+8soA#ZmIaoMcu=)m`t=IhGGcl861?V}R zGwq8(d+h_VWlPT3W^B*wZtE~UX?!}{X?(`mo9Q+_yX6adHR(X}g?^j-bHnOnH@@{H zi$A?(F+*=zX_r0v0QjdAr)LAaxPiB&^xI?za$4m>eJrKmofSnw{$2E0$Hd-`&|hyx zWbb-wU}L^n*^=^yVrwlcTT}9_Li=31xW)GGw9FcjoNKDfJ6dImoB{z|KCv7CEA zmoH*3B%J=aHxhnX@e(kDDzM(Ytu$hL+(U6QWDy;5e&;0mr!~1!j36u9Qu*VQYb_g9 zetjS-JJtz$S^1d!S>}yAj_#O@rTC|48wFrTG3bxIheAiEVvl3#kQks z*q*JP_mM1C!mibebe7Jl7-jX}f+NxE==lqwM}^6vEq>sJmH#Q@vP8xm4oY0%&#@E>uH-|fmd0Ry24-p|hNre1WApMqz@LN{ALWJL% z;tN3fT_(cL10wu>pm>h4!)~4kyCxBN4-t`fnTUCFMCiRigx)(q`d=c#{|&`&65)SY z@f_cUM^Go?QQXbI418O}uVDR&&tX%b?MF?cb};@P+5d_7TZH2~DF^2}h`d8_e%q1r zeM`Bic#q=P!jark2$0O@@Kb19m8mrGP^dN}=S0jufUF4Jp)vm>ipU zu>cuoQZJ@{X)dO`g>hHcoeNTMgP9qx3M|Vz1)YZ+C3-H948Fx{`73 +#include +#include +#include +#include +#include +#include +#include +#include + + +#define PORT_I2C "/dev/i2c-1" + +// some curious things https://www.john.geek.nz/2012/12/update-reading-data-from-a-bosch-bmp085-with-a-raspberry-pi/ + + +I2C_Driver::I2C_Driver(const uint8_t& channel, const uint8_t& mode) +{ + char filename[20]; + snprintf(filename, 19, "/dev/i2c-%d", channel); + + deviceDescriptor = open(filename, O_RDWR); + if (deviceDescriptor < 0) { + std::cout << "unable to open : "<< deviceDescriptor << " ! quiting" << std::endl; + exit(1); + } +} + +uint8_t I2C_Driver::writeByte(const uint8_t& address, const uint8_t& data) // retuns 0 when a sucsessful transation ocures +{ + if (ioctl(deviceDescriptor, I2C_SLAVE, address) < 0) + { + std::cout << "Unable to reach device : "<< address << " ! quiting" << std::endl; + exit(1); + } + + send_buffer[0] = data; + + if ((write(deviceDescriptor, send_buffer, 1)) != 1) + { + std::cout << "Unable to write quiting" << std::endl; + exit(0); + } + return 0; +} + +uint8_t I2C_Driver::readByte(const uint8_t& address, const uint8_t& reg) +{ + if (ioctl(deviceDescriptor, I2C_SLAVE, address) < 0) + { + std::cout << "Unable to reach device : "<< address << " ! quiting" << std::endl; + exit(1); + } + + writeByte(address,reg); //Initiate a write to indicate the desired register to read + + if (read(deviceDescriptor, recieve_buffer, 1) != 1) // An then initare a read request of 1 byte + { + std::cout << "Unable to read quiting" << std::endl; + exit(1); + } + return recieve_buffer[0] ; +} + + +uint8_t I2C_Driver::writeWord(const uint8_t& address, const uint8_t& reg, const uint16_t& data) // retuns 0 when a sucsessful transation ocures +{ + + if (ioctl(deviceDescriptor, I2C_SLAVE, address) < 0) + { + std::cout << "Unable to reach device : "<< address << " ! quiting" << std::endl; + exit(1); + } + + send_buffer[0] = reg; + send_buffer[1] = data; + + if ((write(deviceDescriptor, send_buffer, 2)) != 2) + { + std::cout << "Unable to write quiting" << std::endl; + exit(0); + } + return 0; +} + +uint16_t I2C_Driver::readWord(const uint8_t& address, const uint8_t& reg) +{ + uint16_t result = 0 ; + if (ioctl(deviceDescriptor, I2C_SLAVE, address) < 0) + { + std::cout << "Unable to reach device : "<< address << " ! quiting" << std::endl; + exit(1); + } + + writeByte(address,reg); //Initiate a write to indicate the desired register to read + + if (read(deviceDescriptor, recieve_buffer, 2) != 2) // An then initare a read request of 2 bytes + { + std::cout << "Unable to read quiting" << std::endl; + exit(1); + } + result = (recieve_buffer[0] << 8) + recieve_buffer[1] ; + return result ; +} diff --git a/training/cpp/periferals/i2c/i2c_driver.h b/training/cpp/periferals/i2c/i2c_driver.h new file mode 100644 index 0000000..dd69c05 --- /dev/null +++ b/training/cpp/periferals/i2c/i2c_driver.h @@ -0,0 +1,28 @@ +#include +#include +#include +#include "../../management/errorHandling.h" +#include "../../systems/systemCall.h" + +class I2C_Driver +{ + public: + I2C_Driver(const uint8_t& channel, const uint8_t& mode); + uint8_t readByte(const uint8_t& address, const uint8_t& reg); + uint16_t readWord(const uint8_t& address, const uint8_t& reg); + uint8_t writeByte(const uint8_t& address, const uint8_t& data); + uint8_t writeWord(const uint8_t& address, const uint8_t& reg, const uint16_t& data); + + + private: + int16_t deviceDescriptor; + uint8_t device_address; + uint8_t device_reg; + uint8_t send_buffer[32]; + uint8_t recieve_buffer[32]; + uint8_t blocks; + uint8_t channel; + uint8_t mode; +}; + + diff --git a/training/cpp/periferals/i2c/i2c_driver.o b/training/cpp/periferals/i2c/i2c_driver.o new file mode 100644 index 0000000000000000000000000000000000000000..57c9c2645196bfebd321609347176c8c4b1db8a1 GIT binary patch literal 5280 zcmcgwU2Ggz8U1E=oj5gG2-R-aDo`m#>O&tQ%sDf6 zCfB1lN_pT~v*(`sefRsjKeOJS4~;%;7>2~nkZ!rpL_XUUN?Q6t=$2iQ7dh4QkKFuk zR=Ss-Sutftvn#)&*=+)?j;2_*n(Z>Oa@D-n+>@XC@IUM8|7y2JRx;>kWp0^Vthwce z`Il7_`t#;{%fvP7*0RX>hr31IKAXSRJS*3lp{_ZX$g}ym<&0)y0D8L30~$9Z@=e>+ z$t{hn$g6+;7|~0oO4d>s=aWZ1t;lC5^2sBgRuvcL??j)uWf9K@@Du0pyQh$gb$3<8 zzWpX-H?`Q4d8ydn(qd&j-q3g)d!9bcTVWhI^Sur6Ft(ia(u!fCuCN`)W1xnHHMa*g zvvFLlBHNF`z7@v>e|oJ%)e3XMHHvGM-74~As#a&o)%rhby*`5PIKFhf79m@V<3epW ztJfd2`mkPe8c*tFc3|x~nyu0i`qS5s{jSeZuM@D}7smyE)&u-SHnAtP{q>-l)gDr_ zHf!^J_9=XBR<}El-HGFSNZoE|akFmo8c*t$+GlOx^Ei(U^X@8hY}sV*Wm0=D^MBlX z?KrD>oYgj*)pnd!?%j8+k!7A4-X&ZU<`JLS)?J&|at$?E(`uQ_%Wu4ImbBWjmJ1q> zYuS!H*p}~T=G7k5<6)nB@KNhF1^dZ82!9g~@E6&<)ofVntJyx@tLv*A+lRX<9J5~h zfOUDt`cYVuhn;PGpSEguA@>09m2Dz>c|N<%YfY^6atpYr>eh*|PQ;gw>!_WH^>uZL z#GvkvR_L>C%X}x`ZjSZz_s_wSck!U#>-Ov`$#lh;EPG~9HLEqRVjeMJ&-{k@lW9Nj zE9XR>P2_dYai>g7^<6L0yDz&`_X97PbblOkO3APseckxQ{QTvY8S>}ta}L`Qo}KJu zMA`v;S&=T_3po+Kd+wls%=PG&2+>hI(wMpNpm;;4F1*@n3iF(a1J{~bS zR)C)4Ig`E^wAa!vTeh?s+l=j*-MKd7%f?r-?Z#J)y_rtqYg@jlSCbAjU+CxL-y2pZ zyW#CGlEt6ivY4T_thDeOf!11Nk7D#}K+bU4BA!d>=j6MP(JCM6mwA#-h zZ|fZWcXiI%;XbrWb^oGQFSxaubd|*Z;dn4wJY4fV*Sq95Jlm~S8bN*94I@IwIzhE=JN0wXV84H^ zQmuQ^<$(8Lej{)K-?eGocgp@x!KxM8sgz(jihs*tL3*&NgIKjI&A!4u>zI#W6M#?h-wT(2%A=8{@%%Uv1bZzt=a6wI3`FT}*1?1l|lcn_X&D z?J4YqviG1lCpbqAU`uyC7X7c$*)1|f{G7)}XQ2YuJeqSTP@0-M;$O5rn-^L2a_8nYJyXA&6HBbeYxG8+)bz8D~;2qJC*6qP%!6pfu4&A`Y3DII`Fv-&(V;Hy!=J%2h<1<&Zk~0o_&gA%Z2T# zW{U&##fD`M^>w{iMtSU)HRd>6g^l)JQGG(JH-Nsb*RK7xq3fND^lC415N!f_@m%uQ z-XQvVzW1<6cyBRZObPXv@AuVMoW~UiV;c~Keey9py1f#9cjJ88<2ZH5C-E>3=FN5$ z_PU~O_(>U`^9sX3d|YQxTB8oz&+s6&T1fCgJsgFk#d^fJ#uR=8y(LV<_LpzrVSFe- f7;Bs>s9fJ6@;7Z_Y>z)H>Uw1i{F)O~i}n5sdO*s% literal 0 HcmV?d00001 diff --git a/training/cpp/runtest b/training/cpp/runtest new file mode 100755 index 0000000000000000000000000000000000000000..3eb78209a23fffa07f6e3386bcc6d370e8c4e726 GIT binary patch literal 48252 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 literal 0 HcmV?d00001 diff --git a/training/cpp/systems/systemCall.cpp b/training/cpp/systems/systemCall.cpp new file mode 100644 index 0000000..d703676 --- /dev/null +++ b/training/cpp/systems/systemCall.cpp @@ -0,0 +1,15 @@ +#include "systemCall.h" + + +std::string execBash(const char* cmd) { + std::array buffer; + std::string result; + std::unique_ptr pipe(popen(cmd, "r"), pclose); + if (!pipe) { + throw std::runtime_error("popen() failed!"); + } + while (fgets(buffer.data(), buffer.size(), pipe.get()) != nullptr) { + result += buffer.data(); + } + return result; +} diff --git a/training/cpp/systems/systemCall.h b/training/cpp/systems/systemCall.h new file mode 100644 index 0000000..ffe2e16 --- /dev/null +++ b/training/cpp/systems/systemCall.h @@ -0,0 +1,14 @@ +#ifndef _SYSTEMCALL_H_ +#define _SYSTEMCALL_H_ + +#include +#include +#include +#include +#include +#include + +// Ide from : https://stackoverflow.com/questions/478898/how-do-i-execute-a-command-and-get-the-output-of-the-command-within-c-using-po +std::string execBash(const char* cmd); + +#endif // _SYSTEMCALL_H_ diff --git a/training/cpp/systems/systemCall.o b/training/cpp/systems/systemCall.o new file mode 100644 index 0000000000000000000000000000000000000000..f7b9606559ff48b41718f63e67f3d05bb36b7431 GIT binary patch literal 27828 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 literal 0 HcmV?d00001