PageRenderTime 27ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 0ms

/library/cash_register/xonxoff.php

http://gevion.googlecode.com/
PHP | 200 lines | 92 code | 23 blank | 85 comment | 11 complexity | b2ed8ae434881c242824639e8acd5b55 MD5 | raw file
Possible License(s): LGPL-2.1, GPL-2.0
  1. <?php
  2. /* $Id: xonxoff.php,v 1.1 2010/03/18 10:08:51 devincen Exp $
  3. --------------------------------------------------------------------------
  4. Gazie - Gestione Azienda
  5. Copyright (C) 2004-2010 Antonio De Vincentiis Montesilvano (PE)
  6. (www.devincentiis.it)
  7. <http://gazie.sourceforge.net>
  8. --------------------------------------------------------------------------
  9. Questo programma e` free software; e` lecito redistribuirlo e/o
  10. modificarlo secondo i termini della Licenza Pubblica Generica GNU
  11. come e` pubblicata dalla Free Software Foundation; o la versione 2
  12. della licenza o (a propria scelta) una versione successiva.
  13. Questo programma e` distribuito nella speranza che sia utile, ma
  14. SENZA ALCUNA GARANZIA; senza neppure la garanzia implicita di
  15. NEGOZIABILITA` o di APPLICABILITA` PER UN PARTICOLARE SCOPO. Si
  16. veda la Licenza Pubblica Generica GNU per avere maggiori dettagli.
  17. Ognuno dovrebbe avere ricevuto una copia della Licenza Pubblica
  18. Generica GNU insieme a questo programma; in caso contrario, si
  19. scriva alla Free Software Foundation, Inc., 59
  20. Temple Place, Suite 330, Boston, MA 02111-1307 USA Stati Uniti.
  21. --------------------------------------------------------------------------
  22. Patch alla classe olivetti_ela, inviata da Francesco Pelassa e recepita sul CVS in data 18.03.2010
  23. Questa classe serve per la generazione delle stringhe da inviare attraverso la seriale RS232 ad un
  24. misuratore fiscale che usa il protocollo Xon-Xoff, per la stampa dello scontrino fiscale attraverso
  25. il gestionale GAzie
  26. I ambiente Linux ?¨ indispensabile che il server web abbia i permessi per poter accedere alla porta seriale RS232 che
  27. normalmente ?¨ il file "/dev/ttyS0" equivalente alla "COM1" degli ambienti Windows; per fare questo si devono dare i seguenti comandi:
  28. sudo addgroup www-data dialout
  29. creare un file /etc/udev/rules.d/40-permissions_rs232.rules
  30. in ubuntu si fa cos??:
  31. sudo gedit /etc/udev/rules.d/40-permissions_rs232.rules
  32. mettendoci dentro la seguente riga:
  33. KERNEL=="ttyS[0-9]", GROUP="dialout", MODE="0777"
  34. poi si fa il restart di udev:
  35. sudo /etc/init.d/udev restart
  36. per maggiori info:
  37. http://ubuntuforums.org/showthread.php?t=782115
  38. e su:
  39. http://guide.debianizzati.org/index.php/Udev_e_Debian
  40. */
  41. class xonxoff
  42. {
  43. function xonxoff() {
  44. // di default la seriale usata ? la "/dev/ttyS0" equivalente a "COM1" su Windows
  45. $this->serial='0';
  46. $this->_open=false;
  47. }
  48. public function set_serial($dev) {
  49. // cambio della seriale di default (ttyS0 o COM1)
  50. /* il numero intero di seriale da passare ?¨ comunque quello dei sistemi Linux,
  51. su Windows automaticamente esso viene aumentato di 1; quindi
  52. per usare COM1 su Windows si deve comunque passare "0", in ogni caso
  53. su $dev si pu? passare al posto del numero anche una stringa corrispondente
  54. alla periferica realmente interessata es. "/dev/ttyS0" su Linux o "COM1" su
  55. Windows.
  56. */
  57. $this->serial=$dev;
  58. }
  59. public function open_ticket() {
  60. $this->_send('K');
  61. // nulla
  62. }
  63. public function set_cashier($user='') {
  64. // imposto il nome del casiere
  65. //$this->_send('O1');
  66. }
  67. public function descri_ticket($descr='') {
  68. // stampa rigo descrittivo
  69. $this->_send('"'.$descr .'"@');
  70. }
  71. public function close_ticket($d='1') {
  72. $this->_close_port();
  73. }
  74. public function open_drawer($d='1') {
  75. // apertura cassetto
  76. $this->_close_port();
  77. }
  78. public function row_ticket($amount,$descr='',$vat='',$row='') {
  79. // vendita articoli
  80. // il formato dell'importo deve essere senza punti e virgole e con 2 decimali
  81. $formato_ammount=number_format($amount, 2, '', '');
  82. $this->_send('"' .$descr. '"' . $formato_ammount .'H1R');
  83. }
  84. public function pay_ticket($cash='',$descr='') {
  85. // pagamento
  86. $this->_send('1T');
  87. }
  88. public function simple_ticket($amount) {
  89. // Esempio di scontrino completo con pagamento contanti
  90. // senza descrizioni, una cosa veramente minimale
  91. $this->open_ticket();
  92. $this->row_ticket($amount);
  93. $this->pay_ticket();
  94. $this->close_ticket();
  95. }
  96. public function fiscal_report() {
  97. // Stampa rapporto fiscale Z10
  98. $this->_send('z1Fc');
  99. // Chiusura rapporto fiscale Z10
  100. $this->_send('');
  101. $this->_close_port();
  102. }
  103. protected function _tag_data($data) {
  104. $x=32+strlen($data);
  105. return chr($x).$data;
  106. }
  107. protected function _crc($data) {
  108. $x=0;
  109. for ($i=0; $i<strlen($data); $i++) {
  110. $x+=ord($data[$i]);
  111. }
  112. return str_pad(strtoupper(DecHex($x)),4,'0',STR_PAD_LEFT);
  113. }
  114. protected function _open_port() {
  115. // setting serial port rs232
  116. $sysname=substr(php_uname(),0,3);
  117. if ($sysname == "Lin") {
  118. if (is_numeric(substr($this->serial,0,1))){
  119. $_serial='/dev/ttyS'.intval(substr($this->serial,0,1));
  120. } else {
  121. $_serial=$this->serial;
  122. }
  123. exec('stty -F '.$_serial.' baud=9600 +cs8 -parenb +cstopb clocal -crtscts -ixon -ixoff');
  124. } elseif ($sysname == "Win") {
  125. if (is_numeric(substr($this->serial,0,1))){
  126. $_serial='COM'.intval(substr($this->serial,0,1)+1);
  127. } else {
  128. $_serial=$this->serial;
  129. }
  130. exec('MODE '.$_serial.' BAUD=9600 DATA=8 PARITY=N STOP=1 XON=OFF');
  131. } else {
  132. trigger_error("Il Sistema operativo non risulta essere windows o linux
  133. ci sono problemi per settare la porta RS232", E_USER_ERROR);
  134. exit();
  135. }
  136. // end setting serial
  137. $this->_handle=fopen($_serial, "r+");
  138. $this->_open=true;
  139. }
  140. protected function _send($data) {
  141. if (!$this->_open) {
  142. $this->_open_port();
  143. }
  144. fwrite($this->_handle,$data);
  145. /*
  146. Quello che faccio sotto ? per aspettare che l'ECR "digerisca" la stringa inviata
  147. soprattutto in considerazione che non effettuo il controllo della risposta che
  148. invia l'ECR stesso alla rs232 del server.
  149. Purtroppo sui sistemi windows non funziona usleep() per cui devo usare sleep() che
  150. accetta solo valori interi, quindi minimo 1 secondo...
  151. penso che basterebbe anche solo 0.2 sec ovvero usleep(200000) ma funziona solo su linux
  152. */
  153. sleep(1);
  154. }
  155. protected function _close_port() {
  156. if ($this->_open) {
  157. fclose($this->_handle);
  158. $this->_open=false;
  159. }
  160. }
  161. }
  162. ?>