Annotation of freem/src/ssvn_zrpi.c, revision 1.1.1.1

1.1       snw         1: /*
                      2:  *                            *
                      3:  *                           * *
                      4:  *                          *   *
                      5:  *                     ***************
                      6:  *                      * *       * *
                      7:  *                       *  MUMPS  *
                      8:  *                      * *       * *
                      9:  *                     ***************
                     10:  *                          *   *
                     11:  *                           * *
                     12:  *                            *
                     13:  *
                     14:  *   ssvn_zrpi.c
                     15:  *    Support for Raspberry Pi single-board computers
                     16:  *
                     17:  *  
                     18:  *   Author: Serena Willis <jpw@coherent-logic.com>
                     19:  *    Copyright (C) 1998 MUG Deutschland
                     20:  *    Copyright (C) 2020 Coherent Logic Development LLC
                     21:  *
                     22:  *
                     23:  *   This file is part of FreeM.
                     24:  *
                     25:  *   FreeM is free software: you can redistribute it and/or modify
                     26:  *   it under the terms of the GNU Affero General Public License as published by
                     27:  *   the Free Software Foundation, either version 3 of the License, or
                     28:  *   (at your option) any later version.
                     29:  *
                     30:  *   FreeM is distributed in the hope that it will be useful,
                     31:  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
                     32:  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                     33:  *   GNU Affero General Public License for more details.
                     34:  *
                     35:  *   You should have received a copy of the GNU Affero General Public License
                     36:  *   along with FreeM.  If not, see <https://www.gnu.org/licenses/>.
                     37:  *
                     38:  **/
                     39: 
                     40: #include <stdlib.h>
                     41: #include <stdio.h>
                     42: #include <string.h>
                     43: 
                     44: #include "mpsdef.h"
                     45: #include "mref.h"
                     46: #include "ssvn_zrpi.h"
                     47: 
                     48: #if defined(HAVE_WIRINGPI_H)
                     49: # include <wiringPi.h>
                     50: #endif
                     51: 
                     52: int rpi_pinmode[RPI_PINCOUNT];
                     53: 
                     54: void ssvn_zrpi_init (void)
                     55: {
                     56:     register int i;
                     57:     
                     58: #if defined(HAVE_WIRINGPI_H)
                     59: 
                     60:     wiringPiSetup ();
                     61:     
                     62:     for (i = 0; i < RPI_PINCOUNT; i++) {
                     63:         pinMode (i, INPUT);
                     64:         rpi_pinmode[i] = INPUT;
                     65:     }
                     66: 
                     67: #endif
                     68:     
                     69: }
                     70: 
                     71: void ssvn_zrpi (short action, char *key, char *data)
                     72: {
                     73:     int pin;
                     74:     
                     75:     freem_ref_t *ref = (freem_ref_t *) malloc (sizeof (freem_ref_t));
                     76:     char *kbuf = (char *) malloc (STRLEN * sizeof (char));    
                     77:     char *verb = (char *) malloc (STRLEN * sizeof (char));
                     78: 
                     79:     NULLPTRCHK(ref,"ssvn_zrpi");
                     80:     NULLPTRCHK(kbuf,"ssvn_zrpi");
                     81:     NULLPTRCHK(verb,"ssvn_zrpi");
                     82:     
                     83: #if !defined(HAVE_WIRINGPI_H)
                     84: 
                     85:     /* not on a Raspberry Pi */
                     86: 
                     87:     *data = EOL;
                     88:     merr_raise (NORPI);
                     89: 
                     90:     goto done;
                     91: 
                     92: #else
                     93: 
                     94:     mref_init (ref, MREF_RT_SSVN, "");
                     95:     internal_to_mref (ref, key);
                     96: 
                     97:     stcpy (kbuf, key);
                     98: 
                     99: 
                    100:     if (strcmp (ref->subscripts[0], "INITIALIZE") == 0) {
                    101: 
                    102:         ssvn_zrpi_init ();
                    103: 
                    104:         *data = EOL;
                    105:         merr_raise (OK);
                    106: 
                    107:         goto done;
                    108: 
                    109:     }
                    110: 
                    111:     if (strcmp (ref->subscripts[0], "GPIO") != 0) {
                    112:         merr_raise (INVREF);
                    113:         goto done;
                    114:     }
                    115: 
                    116:     if (ref->subscript_count < 3) {
                    117:         merr_raise (INVREF);
                    118:         goto done;
                    119:     }
                    120: 
                    121:     pin = atol (ref->subscripts[1]); 
                    122:     strncpy (verb, ref->subscripts[2], 255);
                    123: 
                    124:     if (pin < 0 || pin > RPI_PINCOUNT) {
                    125:         merr_raise (INVREF);
                    126:         goto done;
                    127:     }
                    128:     
                    129:     switch (action) {
                    130: 
                    131:         
                    132:         case get_sym:
                    133: 
                    134:             if (strcmp (verb, "MODE") == 0) {
                    135: 
                    136:                 switch (rpi_pinmode[pin]) {
                    137: 
                    138:                     case INPUT:
                    139:                         sprintf (data, "INPUT\201");
                    140:                         break;
                    141: 
                    142:                     case OUTPUT:
                    143:                         sprintf (data, "OUTPUT\201");
                    144:                         break;
                    145: 
                    146:                     case PWM_OUTPUT:
                    147:                         sprintf (data, "PWM_OUTPUT\201");
                    148:                         break;
                    149: 
                    150:                     case GPIO_CLOCK:
                    151:                         sprintf (data, "GPIO_CLOCK\201");
                    152:                         break;
                    153:                 }
                    154:                        
                    155:                 
                    156:             }
                    157:             else if (strcmp (verb, "DIGITAL") == 0) {
                    158: 
                    159:                 sprintf (data, "%d\201", digitalRead (pin));
                    160:                 break;
                    161:                 
                    162:             }
                    163:             else if (strcmp (verb, "ANALOG") == 0) {
                    164: 
                    165:                 sprintf (data, "%d\201", analogRead (pin));
                    166:                 break;
                    167:                 
                    168:             }            
                    169:             else {
                    170:                 merr_raise (INVREF);
                    171:                 goto done;
                    172:             }
                    173: 
                    174:             goto done;
                    175: 
                    176:             
                    177:         case set_sym:
                    178: 
                    179:             
                    180:             if (strcmp (verb, "MODE") == 0) {
                    181: 
                    182:                 if (stcmp (data, "INPUT\201") == 0) {
                    183:                     pinMode (pin, INPUT);
                    184:                     rpi_pinmode[pin] = INPUT;
                    185:                 }
                    186:                 else if (stcmp (data, "OUTPUT\201") == 0) {
                    187:                     pinMode (pin, OUTPUT);
                    188:                     rpi_pinmode[pin] = OUTPUT;
                    189:                 }
                    190:                 else if (stcmp (data, "PWM_OUTPUT\201") == 0) {
                    191:                     pinMode (pin, PWM_OUTPUT);
                    192:                     rpi_pinmode[pin] = PWM_OUTPUT;
                    193:                 }
                    194:                 else if (stcmp (data, "GPIO_CLOCK\201") == 0) {
                    195:                     pinMode (pin, GPIO_CLOCK);
                    196:                     rpi_pinmode[pin] = GPIO_CLOCK;
                    197:                 }
                    198:                 else {
                    199:                     merr_raise (INVREF);
                    200:                     goto done;
                    201:                 }
                    202: 
                    203:                 goto done;
                    204:                 
                    205:             }
                    206:             else if (strcmp (verb, "DIGITAL") == 0) {
                    207: 
                    208:                 char dta[255];
                    209:                 int val;
                    210: 
                    211:                 stcpy (dta, data);
                    212:                 stcnv_m2c (dta);
                    213: 
                    214:                 val = atoi (dta);
                    215: 
                    216:                 switch (val) {
                    217: 
                    218:                     case 0:
                    219:                         digitalWrite (pin, LOW);
                    220:                         goto done;
                    221: 
                    222:                     case 1:
                    223:                         digitalWrite (pin, HIGH);
                    224:                         goto done;
                    225: 
                    226:                     default:
                    227:                         merr_raise (INVREF);
                    228:                         goto done;
                    229: 
                    230:                 }
                    231:                 
                    232:                 goto done;
                    233: 
                    234:             }
                    235:             else if (strcmp (verb, "ANALOG") == 0) {
                    236: 
                    237:                 char dta[255];
                    238:                 int val;
                    239: 
                    240:                 stcpy (dta, data);
                    241:                 stcnv_m2c (dta);
                    242: 
                    243:                 val = atoi (dta);
                    244: 
                    245:                 if (val < 0 || val > 1024) {
                    246:                     merr_raise (INVREF);
                    247:                     goto done;
                    248:                 }
                    249:                 
                    250:                 analogWrite (pin, val);
                    251:                 
                    252:                 goto done;
                    253:                 
                    254:             }
                    255:             else {
                    256:                 merr_raise (INVREF);
                    257:                 goto done;
                    258:             }
                    259: 
                    260:             goto done;
                    261: 
                    262: 
                    263:         default:
                    264: 
                    265:             merr_raise (INVREF);
                    266:             goto done;
                    267: 
                    268:             break;
                    269: 
                    270:     }
                    271:     
                    272: #endif
                    273: 
                    274:     
                    275: done:
                    276:                 
                    277:     free (ref);
                    278:     free (kbuf);
                    279:     free (verb);
                    280:     
                    281:     return;
                    282: 
                    283: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>