Annotation of freem/src/ssvn_zrpi.c, revision 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>