Catégorie : HACK

The PHP framework interoperability, why is important in 2022 ?

Hello everybody !

Let me show you how we can build a game with PHP here a small train game ( user interopt via web interface, system can be control via human small interface ), with 2 sytstem’s : php-symfony and php-crx-framework.

When you write a lib, you can use it in different way, like direct call, virtualisation call what ever the sense,
interoperability is the most important for a framework.

Few years, i’ve started my own framework and i discover the important
of that. Here is a short code for interoperability with a framework.

I start by install PHP composer packages manager on my LINUX by :

$> php -r « copy(‘https://getcomposer.org/installer’, ‘composer-setup.php’); »
$> php composer-setup.php –install-dir=/usr/local/bin –filename=composer
$> chmod +x /usr/local/bin/composer
$> composer -v
$> composer self-upgrade

In this case, composer is install globally on the system LINUX.
For DEBIAN OS, i simply do that :

$> aptitude search composer
$> composer -v

Witch install :

composer jsonlint{a} php-composer-ca-bundle{a} php-composer-semver{a} php-composer-spdx-licenses{a} php-composer-xdebug-handler{a} php-json-schema{a}
php-psr-container{a} php-psr-log{a} php-react-promise{a} php-symfony-console{a} php-symfony-filesystem{a} php-symfony-finder{a} php-symfony-polyfill-php80{a}
php-symfony-process{a} php-symfony-service-contracts{a}

Get: 1 http:////deb.debian.org/debian bullseye/main amd64 php-composer-ca-bundle all 1.2.9-1 [11.0 kB]
Get: 2 http://deb.debian.org/debian bullseye/main amd64 php-composer-semver all 3.2.4-2 [20.4 kB]
Get: 3 http://deb.debian.org/debian bullseye/main amd64 php-composer-spdx-licenses all 1.5.5-2 [13.3 kB]
Get: 4 http://deb.debian.org/debian bullseye/main amd64 php-psr-log all 1.1.3-2 [9232 B]
Get: 5 http://deb.debian.org/debian bullseye/main amd64 php-composer-xdebug-handler all 1.4.5-1 [16.9 kB]
Get: 6 http://deb.debian.org/debian bullseye/main amd64 php-json-schema all 5.2.10-2 [37.8 kB]
Get: 7 http://deb.debian.org/debian bullseye/main amd64 jsonlint all 1.8.3-2 [13.5 kB]
Get: 8 http://deb.debian.org/debian bullseye/main amd64 php-symfony-polyfill-php80 all 1.22.1-1 [9976 B]
Get: 9 http://deb.debian.org/debian bullseye/main amd64 php-psr-container all 1.0.0-2 [3436 B]
Get: 10 http://deb.debian.org/debian bullseye/main amd64 php-symfony-service-contracts all 1.1.10-2 [8052 B]
Get: 11 http://deb.debian.org/debian bullseye/main amd64 php-symfony-console all 4.4.19+dfsg-2 [82.7 kB]
Get: 12 http://deb.debian.org/debian bullseye/main amd64 php-symfony-filesystem all 4.4.19+dfsg-2 [26.1 kB]
Get: 13 http://deb.debian.org/debian bullseye/main amd64 php-symfony-finder all 4.4.19+dfsg-2 [31.4 kB]
Get: 14 http://deb.debian.org/debian bullseye/main amd64 php-symfony-process all 4.4.19+dfsg-2 [36.3 kB]
Get: 15 http://deb.debian.org/debian bullseye/main amd64 php-react-promise all 2.7.0-2 [18.6 kB]
Get: 16 http://deb.debian.org/debian bullseye/main amd64 composer all 2.0.9-2 [407 kB]

Now here i install composer is specific way for my train « game » call for example « smalltraingame »,
witch can be stored on COMPOSER app store or on another part of the Internet network :

$> php -r « copy(‘https://getcomposer.org/installer’, ‘composer-setup.php’); »
$> cd /home/hosting/www_root/traingame.cloud && mkdir -p bin
$> php composer-setup.php –install-dir=bin –filename=composer
$> chmod +x bin/composer
$> composer self-upgrade
$> cd /home/hosting/www_root/traingame.cloud/html/app-php
$> mkdir /home/hosting/www_root/traingame.cloud/html/app-php/smalltraingameengine
$> composer require frvmcontrolapp/Box2Interuptors
$> composer require frvmcontrolapp/GameSystemControlFr

$> composer require frvmcontrolapp/VRControlerFr
$> composer require frvmcontrolapp/RandomSystem

Of course, composer is in my PATH, here this few command update my : composer.json
Here is my gaming engine example of my header  :

namespace crxcms;
use \crx\crxOrchestratorV0;
use \crx\crxDataSource;
use \crx\TrainGame;
use \crx\TrainController;
use \crx\VRControl;
$p = _APPLI_MAIN_MODULES_PATH_.’myModule/php-ml-master/src’;
$ia = new crxLoaderForLib($p,’frvmcontrolapp’);
use frvmcontrolapp/GameSystemControlFr;
use frvmcontrolapp/VRControlerFr;
use frvmcontrolapp/RandomSystem;
use frvmcontrolapp/BoxWith3Interrupteurs
;

Now like in CPP, i can declare my engine :

And now in my code i can do :
class VRControler{
function __construct(){
$controlTrain=\crx\crxTrainController;
$orchestrator=\crx\crxOrchestrator;
}
function run(){
$orchestrator = new \crx\crxOrchestratorV0();
while($controlTrain->readSystem()){
if($orchestrator->status()==5){ return array(‘ag1′,’step1’);}
if($orchestrator->status()){ return array(‘ag2′,’step2’);}
if($orchestrator->status()){ return array(‘ag3′,’step1’);}
}
}
}

class TrainGame{
function __construct(){}
function __runInstance(){

$dbi = \crx\crxDataSource::getDs(‘mysql2’);
$user1 = new \crx\crxUser(‘A’,’20’);
$user2 = new \crx\crxUser(‘B’,’20’);
$randomSystem = new RandomSystem();
$my_object = new Train(‘red’,’8′,’tgv’);
$control = new BoxWith3Interrupteurs();
$vr_system = new \crx\VRControl($user1,$user2,$randomSystem,$control);
$crxGame = new \crx\GameStd($my_object,$vr_system,$users);
$crxGame->run();

}

}

 

Here :
=> TrainGame is one of my PHP class.
=> TrainController is a simple SERIAL PORT reader for example ( with custom protocol based on 2 interuptors button system ).
=> crxOrchestrator system engine use : TCP-IP/SEMAPHORES control system loop.

So finnaly we got this gaming system :

DEBIAN-LINUX-Bullseye-OS
{
PHP framework A => Call composer librairies (framework B) => Call Python ( machine learning system )
}

A bientôt !

Sources :
https://tecadmin.net/how-to-install-and-use-php-composer-on-debian-11/
https://stackoverflow.com/questions/3902754/mit-vs-gpl-license
https://fr.wikipedia.org/wiki/Composer_(logiciel)
https://getcomposer.org/
https://fr.wikipedia.org/wiki/C%2B%2B

HAM – SETUP RASPBERRY PI for remote station via installer script.

Hello to all,

Configure your RASPBERRY PI 4 with CRX-COM + VOIP and FLRIG,
via these « installer » scripts : https://git.crx.cloud/f4eyq/crx-com/tree/master/scripts

See SETUP here :  https://git.crx.cloud/f4eyq/crx-com/blob/master/scripts/README.md
Setup is done via the single line :  ( it download and launch the DEBIAN installer ) :

wget --output-document /tmp/setupcrx.bash https://git.crx.cloud/f4eyq/crx-com/raw/master/scripts/setup_server.bash;chmod +x /tmp/setupcrx.bash;/tmp/setupcrx.bash;

The configuration work via a single file : « station.conf » :

pi@rmtrpi4f4eyq remote $ ll
total 16
-rw-r--r-- 1 root root 47 sept. 30 11:43 station.conf
lrwxrwxrwx 1 root root 36 sept. 30 11:49 voip.conf -> /opt/crx/conf/remote/voip_hight.conf
-rw-r--r-- 1 root root 33 sept. 30 11:49 voip_hight.conf
-rw-r--r-- 1 root root 31 sept. 30 11:49 voip_low.conf
-rw-r--r-- 1 root root 29 sept. 30 11:49 voip_mid.conf
pi@rmtrpi4f4eyq remote $ pwd
/opt/crx/conf/remote
pi@rmtrpi4f4eyq remote $ cat station.conf
SOUND_CARD="plughw:0,0"
STATION_NAME="f4eyq-1"
pi@rmtrpi4f4eyq remote $

You can edit your VOIP profile ( low / mid / hight ) via the command :

The VOIP is start via the rc.local file on the PI with this single line :

sudo su - pi -c "screen -dm -S pistartup /opt/crx/seren/voip.bash --start";

The SYSTEMD part for command used two scripts :

=> tcp_serial_catsystem.service
=> crx_com_tcp.service

sudo systemctl start crx_com_tcp.service
sudo systemctl stop crx_com_tcp.service

sudo systemctl start tcp_serial_catsystem.service
sudo systemctl stop tcp_serial_catsystem.service

=> with the first script you can use FLRIG, with second CRX-COM.

Tnx to @f4goh for his help,
Good weekend to all 73 s

PS: it work on all Raspberry PI version, Debian , Ubuntu, also into VMWARE Workstation/VIRTUALBOX.

HAM – Programmation d’un bouton VFO USB.

Update 22/09/2020 : mise à jour du script pour le support de CRX-COM ( alt+t, alt+o, alt + l ).

Je vous propose la programmation d’un bouton USB « Cooidea USB Volume Control » en bouton VFO. L’idée est d’utiliser un bouton USB de contrôle de volume pour piloter un VFO radio. Cette idée m’est venue il y a quelques mois et voyant une console remote sur un transceiver SDR « haut de gamme ». J’ai décidé d’investir dans un périphérique identique mais pour l’audio (qui coute 30 euros environ) et ensuite de créer une macro pour le contrôler.

Pré requis : disposer d’un bouton USB de contrôle du volume, ici je suis parti sur un « Cooidea USB Volume Control », n’importe quel bouton USB de contrôle de volume fera l’affaire. On le tourne pour le volume et on appuie dessus pour couper ou pas le son.

Comment ça marche ? Ici mon logiciel « CAT SYSTEM » FLRIG ne dispose pas du support de ce bouton nativement, j’ai donc créé un script « MACRO » qui permet de le faire. Ce script fonctionne avec AUTOHOTKEY qui est un petit langage de macro super pratique.

Afin d’optimiser les choses, je mémorise la position du curseur de souris et la fenêtre active quand le bouton est utilisé afin de ne pas modifier votre fenêtre active et votre souris (je remets tout en place une fois le scroll/commande PTT faite).

1. Installer AUTOHOTKEY :  ( pour nos amis pingouins, utiliser AutoHotkeyX )

Rendez vous ici : https://www.autohotkey.com/

2. Mon script AUTOHOTKEY  « cooidea4Ham.ahk » :

La première étape va être de lancer le logiciel de contrôle CAT SYSTEM ( ici FLRIG ).

Une fois lancé on va repérer 2 choses :
– la position X,Y du digit KHZ ( là où l’on peut avec la souris faire un scroll up/down ).
– la position X,Y du bouton PTT ( là où l’on va cliquer pour passer en émission ).

Pour ce faire, j’ai inclus un mode « configuration » dans le script, vous permettant de récupérer les coordonnées X et Y.
Ensuite on va simplement éditer le script avec ces coordonnées.

C’est ce que je vous propose à l’étape 3.

3. Configurer le script : 

Commencez par installer mon script là ou vous voulez ( il est disponible tout en bas de l’article ).
Ensuite on peut passer à sa configuration :

Editez le script avec votre bloc note favoris :
– passez la variable ci-dessous à 1
– on la passera à 0 une fois la configuration terminée :

;Enable only for coordination conf :
global CfgMode := 1

Ensuite lancez le script (double-clic dessus ou clic-droit : Run script).

Ensuite disposez votre logiciel là ou vous le souhaitez, notez que FLRIG mémorise sa position,
donc il sera de nouveau là lorsque vous le relancerez.

Ici je vous ai indiqué les 2 points que nous allons contrôler avec le bouton,
le digit « Khz » et le bouton « PTT » :

On va cliquer sur la fenêtre de notre logiciel « CAT SYSTEM » ici FLRIG.
– On se place avec la souris sur le digit des Khz dans le logiciel ( voir schéma C1 )
– Puis l’on va avec notre bouton VFO USB, le tourner vers le haut et regarder la popup qui s’affiche ici (juste en dessous du curseur de la souris) :

Current cursor position: 885, 75

– Même chose on va aller avec la souris sur la bouton « PTT » et récupérer les coordonnées X et Y (voir schéma C2 ) :

Current cursor position: 1640, 123

Il ne nous reste plus qu’à configurer le script avec ces valeurs,
Pour ce faire éditez celles-ci :

;Mouse position for Khz control :
; screen1 : 885,75 (flrig in full size top of screen here).
; screen2 : 728,88
global TwcX := 885
global TwcY := 75
;Mouse position for button PTT control :
; screen1 : 1633,123 (flrig in full size top of screen here).
; screen2 : 1317,123
global TwxX := 1633
global TwxY := 123

Enfin on va repasser la variable « CfgMode » à 0, on sauvegarder le script.

Ensuite on ferme et on exécute de nouveau notre script « cooidea4Ham.ahk »,
Et voilà vous pilotez maintenant le VFO via un bouton USB !

Bien sûr si vous utilisez un autre logiciel pour le pilotage (HRD par exemple ou n’importe quel logiciel SDR),
Il vous suffira d’adapter les variables du script :

;Window SDR/CAT class name :
global Twc := "Flrig"

Qui correspond à la valeur « ahk_class » d’AUTOHOTKEY.

4 Autre exemple, pilotez le WEB SDR

Voici un autre exemple pour piloter le SDR WEB avec le bouton USB :  http://websdr.ewi.utwente.nl:8901/
Faite une copie mon script, nommez là par exemple : « WEBSDR.ahk »

Ensuite, lancez le SDR, puis repérez le X, Y ( en activant : global CfgMode := 1  comme je l’ai indiqué avant ),
Pour ce faire lancez alors le script « WEBSDR.ahk », le debug va nous donner la valeur C1 ici :

Fermez le programme (clic droit sur l’icône H en vert dans la barre de tâche),
Editez la variable : CfgMode  et passez là à 0.

Renseignez alors les 2 variables X, Y avec par exemple :
global TwcX := 650
global TwcY := 760

Relancez le script, et voilà vous pouvez piloter le WEB SDR avec votre VFO USB !

73 à tous,
Bastien

PS: Voici mon script (à copier/coller quelque part sur votre PC, par exemple votre bureau)

;-----------------------------------------------------------------
; Control CRX/SDR/FLRIG by F4EYQ
; File			 : cooidea4Ham.ahk
;
; Description 	 : AutoHotkey script to map Volume UP/DOWN to Mousse Whell
; 				   and Mute/Unmute action (press on sound button) to PTT control.
;
; Hardware 		 : Cooidea USB Volume Control
;
; Date 			 : 08/2020
; Update		 : 22/09/2020 add CRX Control short key.
;
;-----------------------------------------------------------------
;Configuration : 
;-----------------------------------------------------------------
;Window SDR/CAT class name  :
global Twc := "Flrig"

;Enable only for coordination conf :
global CfgMode := 0

;Mouse position for Khz control :
; screen1 : 885,75 (flrig in full size top of screen here).
; screen2 : 728,88
global TwcX := 885
global TwcY := 75

;Mouse position for button PTT control : 
; screen1 : 1633,123 (flrig in full size top of screen here).
; screen2 : 1317,123
global TwxX := 1633
global TwxY := 123

;-----------------------------------------------------------------
;Global VARS: 
;-----------------------------------------------------------------
;Transceiver PTT status : 
global TwcTX := 0

;---------------------------
;Configure device mapping : 
;---------------------------
Volume_Up::MousseWheelUpDown("UP")
Volume_Down::MousseWheelUpDown("DOWN")
Volume_Mute::ControlTX()
;---------------------------
ControlTX()
{
	if TwcTX=0
	{
	 Send !t
	 TwcTX=1
	 WinActivate, ahk_class %Twc%
	 ;click on "PTT button"
	 MouseClick, left,%TwxX%,%TwxY%
	 MouseMove, %TwcX%, %TwcY%, 0
	}
	else 
	{
	  Send !t
	  TwcTX=0
	  WinActivate, ahk_class %Twc%
	  ;click on "PTT button"
	  MouseClick, left,%TwxX%,%TwxY%
	  MouseMove, %TwcX%, %TwcY%, 0
	}
}

MousseWheelUpDown(direction)
{
	;get current active window ID and class :
	Awc := WinExist("A")
	WinGetClass, class, A
	
	;need to retreive initial frequency cursor position :
	MouseGetPos,xpos,ypos,id,control
	
	;debug/conf if needed : 
	if(CfgMode=1){
		ToolTip, Current window Class:`n%class%`nCurrent cursor position:`n%xpos%`n%ypos%
	}
	;get current mouse pos:
	;MouseGetPos,xpos,ypos,id,control
	
	;set scroll on the flrig window:
	;WinActivate, ahk_class %Twc%
	;MouseMove, %TwcX%, %TwcY%, 0
	
	if(direction="UP"){
		Send !o
		;Send, {WheelUp}
	}
	
	if(direction="DOWN"){
		Send !l
		;Send, {WheelDown}
	}
	
	;set old position:
	;WinActivate, ahk_id %Awc%
	;MouseMove, %xpos%, %ypos%, 0
}
Control CRX/SDR/FLRIG by F4EYQ