Samtalsblockering med nummerpresentation
Förord
Specialarbetet om samtalsblockering med nummerpresentation har till syfte att utöka de produkter som finns på marknaden för att ge personer en möjlighet att spärra inkommande samtal beroende på vem som ringer. Arbetet omfattar en apparat avsedd att kopplas in mellan telefonjacket och den telefon som skall ha spärren samt ett datorprogram. Spärrningen innebär att det inte ringer i användarens telefon då någon ringer till denne från ett visst telefonnummer. För att kunna mata in de nummer som man avser att spärra kopplas apparaten till skrivarporten på en persondator och med hjälp av datorprogrammet övervakas och styrs sedan det hela. Tack vare datorns och programmets möjligheter kan apparatens funktion bli mycket flexibel; alltifrån samtalsloggning, spärrning av nummer och nummerserier med mera kan utnyttjas.
1. INLEDNING
Jag har valt att göra ett specialarbete som sträcker sig in både på elektronik- och dataområdet eftersom båda dessa ämnen intresserar mig väldigt mycket. Att persondatorer har blivit mycket vanliga nuförtiden gör det hela förstås ännu intressantare när man ser på vad man kan göra med en dator och egna byggen kopplade till den.Apparaten PhoneBlock har till uppgift att spärra inkommande samtal beroende på vem som ringer. Detta åstadkommer man genom att ansluta apparaten till en dator, som får analysera den information som sänds av telefonväxeln innan ringsignalerna går fram, den s.k. nummerpresentationen, som på sistone har blivit mycket populär i hela Sverige efter Telias storsatsning för några år sedan.
Hittills har det endast funnits apparater som lagrar vilka telefonnummer som ringer, och där har utvecklingen stått still ett bra tag nu. Jag tyckte därför att det var på tiden att utnyttja datorn på ett nyttigt sätt genom att låta den analysera inkommande samtal och bestämma om man skall få höra någon ringsignal i telefonen eller ej - något som säkert många skulle uppskatta.
I specialarbetet får Du se i vilka delar som själva apparaten PhoneBlock är uppbyggd, hur man ansluter den till datorn och vilka uppgifter som programmet (som körs på datorn) har.
Jag har börjat med att undersöka möjligheten att ansluta en apparat till datorn via parallellporten, för att sedan konstruera själva bygget, bestående av ett antal olika delar med olika funktioner och uppgifter. Slutligen har jag skapat ett datorprogram som styr apparaten.
2. LITTERATURÖVERSIKT
ELFA-katalogen nr. 45 1996/1997Datablad enligt notapparat i de fall det intresserar läsaren
3. MATERIAL OCH METODER
3.1 Själva bygget
PhoneBlocks hjärta bygger på en IC-krets som är specialgjord för att ta emot de signaler som sänds ut av telefonväxeln då någon ringer, strax innan ringsignalerna går fram. För att bättre förstå uppbyggnaden av systemet med nummerpresentation i Sverige så bör man läsa f.d. Televerkets specifikation 1) som i detalj beskriver denna teknik.
3.2 Förbehåll
Observera att apparaten PhoneBlock inte är T-märkt och alltså egentligen inte får anslutas till det allmänna telenätet. Bestämmelserna angående detta framgår av abonnemangsvillkoren till din teleoperatörs telefonabonnemang.
3.3 Tonsignaleringen som används
Tonsignalerna bygger på samma teknik som tillämpats ganska så länge för tryckknappstelefoner. I korthet går det ut på att 8 toner kombineras parvis för att ge upphov till 16 olika toner, som var och en motsvarar siffrorna 0-9, knapparna * (stjärna) och # (fyrkant) samt fyra bokstäver, A-D. Dessa tonpar går under benämningen DTMF (Dual Tone Multi-Frequency).
Det är de sistnämnda som används vid överföringen av nummerpresentation. Normalt sett hittar man inte knapparna A, B, C och D på en knapptelefon, och många är därför inte ens medvetna om dessa knappars, eller egentligen toners, existens. De har tidigare använts för kontroller, testutrustningar och liknande av Telia själva, men har alltså tagits i bruk då det gäller nummerpresentation också.
I grund och botten går det ut på att en serie av toner skickas ut innan den första ringsignalen går fram. Detta ger utrustning som t.ex. PhoneBlock en möjlighet att se vem som ringer innan det pinglar till i telefonen.
Numret presenteras av växeln i formatet B
3.4 Standarden för nummerpresentation av idag
Den standard för detta system som satts upp av Telia är mycket omfattande, och innehåller många möjligheter inför framtiden, såsom rapport av landsnummer ifall ett samtal kommer från utlandet, information om huruvida ett inkommande samtal har vidarekopplats från en annan telefon innan det kom hit eller ej och mycket mera. I dagsläget klarar de apparater som finns på marknaden bara av den inhemska delen av denna standard, d.v.s. att skriva ut ett telefonnummer med riktnummer i ett sifferfönster eller liknande. Till stor del beror detta på att något enhetligt system för nummerpresentation över gränserna inte finns i dagens läge. Förhoppningsvis kommer detta inom en nära framtid, men frågan är om medelsvensson får så många samtal från utlandet, och framförallt, har någon nytta av att logga dessa eller kunna läsa av dessa.
Tills vidare sällar sig PhoneBlock, eller rättare sagt dess tillhörande programvara, till de produkter som redan finns när det gäller detta, eftersom något utnyttjande av nummerpresentation vid samtal från utlandet alltså inte är att vänta på länge, som det tycks.
4. PARALLELLPORTEN
4.1 Parallellporten på en persondator av PC-typFör att en dator skall kunna ta emot signalerna på de fem ledare som tidigare har nämnts så krävs en anslutning via någon slags port på denna. Till bygget har jag valt att använda parallellporten, d.v.s. skrivarporten, av framförallt tre viktiga skäl. För det första finns det flera statusledare att tillgå, som ett program kan läsa av. För det andra slipper man någon slags seriell överföring av de databitar som avkodaren MT8870 lämnar ifrån sig. Sist men inte minst så är kommunikationsportarna (COM-portarna) på en PC inte TTL-kompatibla, vilket innebär att en extra krets för omvandling av datasignalerna från bygget till datorn hade behövts. Genom att välja parallellporten på datorn får vi ett TTL-kompatibelt gränssnitt som lämpar sig mycket väl för byggen av den här typen.
4.2 Parallellportens adressering och register
När nu apparaten skall kommunicera med datorn genom användning av parallellporten så är det givetvis av intresse att kartlägga de statusledare som finns att tillgå på denna port. Vi skall börja med att konstatera att det på en PC kan finnas upp till tre, ibland fler, parallellportar. Dessa benämns enligt följande:
- LPT1 (basadress 0x3BCh)
- LPT2 (basadress 0x378h)
- LPT3 (basadress 0x278h)
Den vanligaste porten som finns med alla datorer som man köper är LPT1, som alltså är avsedd för anslutning av en skrivare. Dock brukar denna enda port vara uppsatt med adress 0x378h. Anledningen att den fortfarande benämns som LPT1 är att det är BIOS i datorn som sköter tilldelningen av portnamnen. BIOS namnger portarna i den ordning den hittar dem enligt punkterna ovan; hittas inte någon port på en adress så söker BIOS på nästa o.s.v. Om det då t.ex. bara finns en enda parallellport i datorn så spelar det alltså ingen roll vilken av dessa tre adresser den är inställd på; den kallas ändå för LPT1 av BIOS.
Av denna anledning är adresserna för skrivarporten som bygget sitter på inkluderade i programmet som hör till bygget, och inte bara portnumret (LPT1-LPT3).
De adresser som angivits ovan är de adresser som datorn använder för att kommunicera med porten i fråga. Det går till så att man, i det programmeringsspråk man vill använda, letar upp ett kommando som kan läsa av en port. Man ser till att man har adressen i rätt format (i listan ovan står adresserna i hexadecimalt format, vilket understrukits genom både prefixet 0x och slutbokstaven h, för hexadecimal) och får som svar från detta kommando ett decimalt tal som motsvarar de bitvikter som för närvarande är satta respektive inte satta på just denna adress.
Bitvikterna bygger på det binära talsystemet, och varje adress kan lämna ifrån sig åtta stycken databitar. Detta innebär att det tal som vi får som svar på vår förfrågan om portens status kan variera mellan värdena 0 och 255. (00000000 binärt = 0 decimalt och 11111111 binärt = 255 decimalt).
Nästa viktiga slutsats är, efter en kontroll i litteratur som tar upp detta 3), att basadressen bara är en av tre adresser som beskriver hur det är ställt med statusen på parallellporten. Basadressens åtta bitar används uteslutande för överföring av åtta bitar i taget, nämligen data, till skrivaren som normalt skulle sitta där och skriva ut text på ett papper. Det finns alltså ytterligare två s.k. register, som vardera har åtta bitar som vi kan läsa av med vårt program. Registrena är som följer:
- Statusregistret (basadressen + 1)
- Kontrollregistret (basadressen + 2)
Vi ser alltså att dessa, till sin adress, är förskjutna med 1 respektive 2, i förhållande till basadressen som vi tidigare har talat om. Av dessa två "extra" register är det endast ett, nämligen statusregistret, som vi är ute efter. De signaler som apparaten PhoneBlock kommer att lämna ifrån sig får simulera de signaler som en skrivare normalt skulle ha gett ifrån sig, som t.ex. slut på papper (paper out), fel (error) och upptagen (busy). Namnen antyder varför dessa stift finns i parallellportens kontakt, nämligen för att datorn skall kunna sluta skicka data till en skrivare då t.ex. papperet tagit slut och så vidare. Den som är intresserad av samtliga stift i parallellporten kan läsa vidare om detta i lämplig litteratur 4).
4.3 En undersökning av statusregistret
Jag har med hjälp av ett mycket enkelt program vid namn TEST.CPP, se bilaga 4, undersökt statusen på kontrollregistret då jag med ett par strömbrytare kopplat ett i taget av de fem stift som behövs för anslutningen av bygget till datorn till jord, dvs logisk nolla, respektive låtit dem "hänga löst", dvs logisk etta i TTL-sammanhang. Med hjälp av programmet har jag då kunnat se vilken bitvikt de olika stiften som jag varit intresserad av har haft. Resultaten framgår av tabellen nedan.
Parallellportens stiftnr | Betydelse | Bitvikt | Användning i bygget | Anmärkning |
---|---|---|---|---|
15 | Error | 8 | Q1 (datautgång 1) | |
13 | Select | 16 | Q2 (datautgång 2) | |
12 | Paper end | 32 | Q3 (datautgång 3) | |
10 | Acknowledge | 64 | Q4 (datautgång 4) | |
11 | Busy | 128 | StD (ny siffra detekterad) | Inverteras |
Som synes måste stift nummer 11, Busy, inverteras för att det skall ge den angivna bitvikten. Detta behöver dock inte ens lösas med någon inverterare i själva apparaten PhoneBlock, utan detta kan programmet ordna utan någon större svårighet.
Nu är det alltså upp till programmet att läsa av dessa statussignaler och tolka dem.
4.4 Kommunikationen från datorn till bygget
Det krävs inte enbart utgångar från bygget som kopplas till ingångar på datorns parallellport för att uppnå det syfte som jag har slagit fast för apparaten, nämligen själva blockeringen av ett inkommande samtal (och dess ringsignaler). Vi behöver också en signal från datorn till bygget som skall avges då programmet detekterat ett "svartlistat" nummer och alltså vill att spärrningen skall träda i kraft. För detta ändamål används helt enkelt en av de åtta databitar som normalt sett används för att skicka data till skrivaren med. Dessa ligger alltså, ur programmets synvinkel sett, på basadressen.
Parallellportens stiftnr | Betydelse | Bitvikt | Användning i bygget | Anmärkning |
---|---|---|---|---|
2 | Databit 0 | 1 | Spärra samtalet | |
3 | Databit 1 | 2 | 5 V | från datorn Skall alltid ettställas |
9 | Databit 7 | 128 | Ingen |
Vi använder oss bara av två av dessa ledare. Genom att ange i programmet att vi vill ändra statusen på den basadress som motsvarar den parallellport som vi kopplat in bygget på till 1, så ettställs alltså stift 2 på parallellporten, som genom en ledare i kabeln mellan apparaten PhoneBlock och datorn talar om att samtalet skall spärras. Genom att programmet ger signal på detta stift i någon sekund så hinner den första ringsignalen, som annars skulle ha kommit fram, spärras. Därefter får bygget ta hand om uppgiften att inga fler ringsignaler skall gå fram, till dess att det slutar ringa. Det räcker ju som bekant inte med att spärra en ringsignal - de flesta brukar låta fler signaler än så gå fram.
Stift 3 i parallellporten används för att ge spänningen 5 V från datorn som sedan via optokopplare styr de fem använda ingångarna på parallellporten. Anledningen till detta är att vi vill ha datorn och bygget galvaniskt åtskilda. Du kan läsa mer om detta i kapitel 7.7 som behandlar optokopplardelen i bygget.
5. BYGGETS DELAR
5.1 Strömförsörjningen
Bygget drivs av en batterieliminator på 9 V likström. Tillsammans med en spänningsregulator drivs de olika delarna i bygget av 5 V stabiliserad likström.
5.2 Linjetransformatorn
För att bygget skall kunna anslutas till det allmänna telenätet och för att signalnivåerna skall vara lagom så används en linjetransformator 9) CWC9000 till detta syfte. En standardkoppling enligt datablad 10) har använts för anslutning inom Sverige.
5.3 Tonavkodaren
Tonavkodaren MT8870 används för omvandlingen av tonparen av DTMF-typ till en fyrabitars binär kod. De olika kombinationerna, som var och en representerar en siffra eller ett tecken, återfinns i databladet 2) för kretsen. Kretsen har funnits ett bra tag på marknaden och är faktiskt samma IC-krets som används i de flesta nummerpresentationsapparater som finns att köpa, såsom t.ex. Telia Anita och plagiat av denna. Dessutom är den mycket vanligt förekommande då folk vill bygga sig en "ren" nummerpresentatör till datorn. Ett flertal sådana byggen 5) finns att se på Internet. Samtliga har utnyttjat den standardkoppling som tillverkaren av tonavkodaren har föreskrivit.
Förutom dessa fyra databitar (Q1-Q4) är ytterligare en utgång från kretsen av intresse; nämligen en utgång som indikerar att en ny ton har tagits emot och att utgångarnas status har uppdaterats. Denna utgång (StD, steering delayed output) används för att programmet skall kunna veta om en ny siffra har tagits emot. Den koppling av kretsen som återfinns i ELFA-katalogen 3) är den standardkoppling som tillverkaren rekommenderar. Denna koppling är konstruerad så att en puls genereras av lagom längd på denna utgång. I normala fall är denna puls kortare än cirka 70 ms, eftersom det är ett vanligt värde på längden av de tonpar och den åtföljande paus som telefonväxeln skickar ut.
5.4 Ringsignaldetektionskretsen
För att apparaten, efter en signal om detta från datorn skall kunna spärra ett samtal med tillhörande ringsignaler till dess att personen som ringer har gett upp och ringsignalerna slutar att gå fram så krävs det en krets som kan avgöra huruvida det ringer eller ej. Till detta ändamål används 6) kretsen LS1240A som ansluts direkt till telefonlinjen och sedan genererar ett kvittrande ljud i, som det är avsett, ett piezoelement. Istället för att använda ett piezoelement har jag istället modifierat kopplingen något så att en logisk etta ges till den del av bygget som spärrar samtalet (i grunden ett logikkretsnät kopplat till ett relä kombinerat med en timer). På detta sätt kan samtalet spärras till dess att ringsignalerna slutat att gå fram, till en låg kostnad eftersom kretsen LS1240A inte är särskilt dyr.
Smärre modifikationer fick göras då det gällde värdena på komponenterna kring kretsen. En kondensator på 1 m F släppte inte igenom tillräckligt med ström då det ringde, med följd att utsignalen blev för låg för att kunna trigga någon TTL-krets ingång. Därför ökade jag värdet på denna och mätte sedan utspänningen, som ligger på cirka 3.2 V vilket gott och väl räcker till.
Själva "utgången" från ringsignalsdetektorn bygger på halvvågslikriktning med en diod kopplad till en kondensator, som dessutom laddas ur genom ett motstånd på 510 W så att utgången återgår till noll en kort stund efter det att ringsignalen tystnat. Mätningar har visat att det krävs ungefär en sekund för utsignalen att gå ner till logisk nollnivå.
5.5 Timerdelen
Varje ringsignal som går fram skall om och om igen starta en timer 7) som ser till att reläet är draget (dvs. bryter/spärrar telefonlinjen). Innan den första ringsignalen är det datorn som ser till att denna timer startas, och därefter får varje enskild ringsignal starta om denna timer. Timern måste därför vara av typen re-triggable, dvs. att den kan triggas gång på gång under tiden att den redan är i läge "på", så att utgångens ettställda status under tidsperioden kan förlängas (i själva verket - tidsperioden startas om, dvs. timern börjar om från tiden noll). Till detta används IC-kretsen 74HC5555. I databladet återfinns mycket information, varav det allra viktigaste presenteras här.
Fördröjningstiden, dvs. timertiden, svarar mot 1*r/f = r/f sekunder där r är en delningsfaktor som styrs genom några ingångar på kretsen (i bygget används delningsfaktorn 2^17) och f är frekvensen för den oscillator som används av kretsen. Oscillatorn är av enkel RC-typ och följande data har valts:
Timertiden skall vara 8 sekunder. Detta gör att tiden gott och väl klarar av pausen mellan två ringsignaler, och tack vare att kretsen i sin användning till detta bygge har kopplats så att den triggar på positiva flanker och den tid som minimalt behövs mellan ringsignalerna uppgår till ungefär 6 sekunder, så har man en god säkerhetsmarginal till förfogande.
Valda utdrag ur tillverkarens datablad 8) finns i bilaga 1. De viktiga sidorna i sammanhanget är en översikt över kretsen (pinning och fig. 1, sida 3 i databladet), funktionsbeskrivningen (functional description, sida 4 i databladet), delningsfaktorn (delay time selection, sida 7 i databladet), minimi-, maximi- och typvärden (sidorna 10-11 i databladet) samt diagram över val av komponenter till RC-kretsen (sida 20 i databladet).
Enligt databladet är frekvensen f=1/(2.5*Rt*Ct) där Rt och Ct är ett motstånd respektive en kondensator i RC-kopplingen. Knyter vi samman detta med den tidigare nämnda formeln för timertiden så får vi fram att vi söker en frekvens på cirka 16 kHz, om vi använder de föreslagna komponentvärdena då vi låter Rt variera (se fig. 13, application information, sida 20 i databladet). Rt kan ganska snabbt fastställas till cirka 25 kW . Detta leder i sin tur till att motståndet R2 i RC-kopplingen skall vara 2*Rt dvs. 50 kW . Ct är, i exemplet, fastställd till kapacitansen 1 nF. En snabb kontroll av den uppkomna frekvensen verifierar att den ligger på 16 kHz, vilket var ungefär vad som behövdes för en timertid på 8 sekunder. Noggrannare beräkningar visar att timertiden blir närmare 8.2 sekunder. Avvikelsen har dock ingen betydelse i sammanhanget. Det huvudsakliga syftet är att tiden gott och väl skall räcka till för att i slutändan dra ett relä under en tid av minst 6 sekunder.
Resistanserna 25 kW och 50 kW var dock svåra att hitta, varför dessa istället har ersatts av 24.9 kW respektive 49.9 kW .
5.6 Spärrdelen
Själva spärrningen av samtalet och dess ringsignaler görs med hjälp av en transistor med basmotstånd, en diod och ett relä. Vad som är viktigt här är att reläet skall klara av såväl den spänning som finns på telefonlinjen under samtal (cirka 40 V) men även spänningen då det går fram ringsignaler (cirka 100 V). Det räcker dock med att se hur pass mycket högre som överslagsspänningen för något relä är, jämfört med den spänning som reläet är konstruerat för vid kontaktpolerna för att inse att telefonlinjens 100 V knappast orsakar något överslag i reläet. Något större uttag av ström är det heller inte fråga om. Reläet skall vara av brytande typ, dvs. se till att telefonlinjen är funktionell i vanliga fall, och att den bryts då ett samtal skall spärras.
Spärrdelen styrs av en signal från timerdelen. Telefonlinjen som bryts eller "kopplas igenom" bryts tvåpoligt av reläet. Telefonlinjen går från mellanproppen, ut till bygget, och sedan tillbaka till mellanproppen. Det är med andra ord lämpligt att mellanproppen kopplas in i det första jacket i huset, så att det kan bryta bort alla telefoner om ett samtal skall spärras.
5.7 Optokopplardelen
För att undvika störningar från datorn som kan ta sig över till bygget och spänningar som kan ta sig över från telefonlinjen till datorn så används optokopplare i konstruktionen.
Optokopplarna 11) som används är av typen PC847, som består av fyra lysdioder och tillhörande NPN-fototransistorer inbakade i en IC-kapsel.
Av databladet 12) framgår det att typvärdet på spänning för användning av lysdioderna i optokopplaren ligger på 1.2 V. Resistorn i serie med lysdioden skall då ha värdet 760 W . Närmast under liggande standardvärde är 680 W . Strömmen genom lysdioden blir då ungefär 5.6 mA.
Kollektorströmmen behöver inte vara särskilt hög. En låg kollektorström är bra sett ur datorns parallellports synpunkt, eftersom strömförbrukningen minskar. Kollektorn på varje fototransistorn går till en ingång på en inverterare, 74HCT04.
En parallellport tål inte att belastas särskilt mycket, varför en låg kollektorström i var och en av de fem kollektorkretsarna, som så småningom styr ingångar på parallellporten, inverkar positivt. Dessutom drar IC-kretsen 74HCT04 en bråkdel av vad vanliga 7404 gör.
Genom att använda sig av resistorer på 33 kW i kollektorkretsarna så drar inte dessa tillsammans mer än cirka 1.3 mA i värsta tänkbara fall. Detta värde är så pass lågt att ingen dators parallellport torde ha något problem att driva dessa.
Vad som händer i optokopplardelen i bygget är att lysdioden i optokopplaren styrs av en utgång från antingen datorn eller bygget. Fototransistorn i optokopplaren bottnas, vilket jordar kollektorn på denna. Kollektorn används som utgång till en inverterare, och vi har nu en galvaniskt avskild signal.
- När det gäller överföringen av de fem signalerna från bygget till datorn så fungerar det hela som följer:
Utgångarna från tonavkodaren styr en varsin lysdiod i en optokopplare (totalt 5/4 PC847). Jordkabeln på varje lysdiod är ansluten till byggets jord.
I fototransistoränden av var och en av dessa fem utgångar tas 5 V från ett stift (stift 3) på datorns parallellport. Varje fototransistor har ett kollektormotstånd som begränsar strömuttaget från detta stift i parallellporten. Emittern på varje fototransistor är ansluten till datorns (parallellportens) jord. Kollektorn på varje fototransistor går till en inverterare och sedan till respektive ingång på parallellporten. Inverteraren (5/6 IC 74HCT04) drivs med spänningen 5 V från datorn (parallellportens stift 3).
På detta sätt styr datorn "själv" ingångarna på parallellporten med en egen 5 V-spänning. - Vidare finns det en utgång från datorn till bygget, nämligen den utgång som skall tala om för bygget att ett samtal skall spärras.
Utgången (stift 2 på parallellporten) tänder en lysdiod i en optokopplare. Fototransistorn i andra änden får sina 5 V från byggets strömförsörjning och jordanslutningen till emittern från jordpunkten i bygget. Fototransistorns kollektor är kopplad till en inverterare (1/6 IC 74HCT04) som i sin tur går till timerdelens ingång. Inverteraren drivs med byggets strömförsörjning.
På detta sätt styr bygget själv ingången till sin timerdel med en egen 5 V-spänning.
Som det framgår av resonemanget ovan så krävs det alltså att stift 3 i parallellporten alltid är ettställt. Detta ordnas av programvaran, som helt enkelt skickar värdet 3 (1+2) till porten då ett samtal skall spärras, och bara värdet 2 då ett samtal inte skall spärras. Då ett samtal skall spärras är alltså stiften 2 och 3 ettställda, medan endast stift 3 är ettställt vid alla andra tidpunkter.
5.8 Designen och utseendet
Bygget består av följande delar:
- Mellanpropp (ansluts till telefonjacket)
- Apparatlåda (själva bygget)
- Batterieliminator (ansluts till vägguttaget)
- Parallellportskontakt (ansluts till datorns skrivarport)
Det som ytterligare behövs för att bygget skall kunna användas är:
- Dator (IBM PC-kompatibel)
- Microsoft Windows 3.1
- Programvaran PhoneBlock
- Telefonabonnemang med tjänsten nummerpresentation påslagen
- På apparaten återfinns en strömbrytare (PÅ/AV) som i läge av ser till att inget samtal spärras av vare sig apparaten eller datorn, eftersom inget relä då kan "bryta" linjen.
En grön lysdiod (PÅ) indikerar om apparaten är på- eller avslagen.
En röd lysdiod (SPÄRRA) indikerar om ett samtal spärras just nu.
6. PROGRAMVARAN
6.1 Programmet PhoneBlock
Programmet som styr bygget körs i Windows-miljö och är skrivet i Microsoft Visual Basic 4.0.
För att kunna köra programmet krävs följande DLL-filer:
- VB40016.DLL
- OC25.DLL
- INPOUT16.DLL
VB40016.DLL och OC25.DLL används av 16-bitars Visual Basic-applikationer som är skapade med Microsoft Visual Basic 4.0. Den tredje DLL-filen 13) vid namn INPOUT16.DLL används av programmet för att kommunicera med skrivarporten.
Dessa filer måste placeras i katalogen \WINDOWS\SYSTEM för att det hela skall fungera.
Själva programmet, PBLOCK.EXE, kan däremot placeras i valfri katalog.
Första gången programmet startas dyker en ruta upp som ber en att ställa in programmet. När man klickar på OK så kommer man då automatiskt till programmets inställningsruta.
6.2 Programmets funktioner
Programmet är upplagt i form av ett fönster, med två "teckenrutor", inte helt olikt en vanlig nummerpresentatör, och ett antal knappar för de olika funktionerna.
Det övre teckenfönstret visar antingen "Inget nummer", ett inkommande samtals telefonnummer, siffror som man själv slår på telefonen då man ringer ett samtal, "Okänt nummer" om någon ringer från en telefon som ej är ansluten till en modern AXE-växel eller "Skyddat nummer" om någon ringer från t.ex. ett hemligt telefonnummer.
Vid egen nummerslagning så rensas teckenfönstret om det dröjer mer än en sekund mellan varje siffra som man slår på sin telefon.
Det nedre teckenfönstret visar information om de funktioner man har valt; t.ex. om man väljer "Spärra alla" så skrivs en förklaring till funktionen ut i detta fönster.
De olika alternativen eller funktionerna som man har att välja på i programmet är:
- Spärrlista
I spärrlistan anger man de nummer som man vill skall spärras. Numrena anges i den för detta ändamål avsedda listrutan. Endast ett nummer per rad är tillåtet. Inga mellanslag eller andra tecken är tillåtna i numret, förutom bokstäverna A och B som beskrivs nedan.
Nummer kan spärras på flera olika sätt:- A
spärrar telefonnummer som börjar på . På så sätt kan t.ex. alla telefonnummer i ett visst riktnummerområde spärras. Exempel: A018. - A
B spärrar ett specifikt telefonnummer i dess exakta form. Exempel: A08123456B. B spärrar telefonnummer som slutar på . Exempel: 456B. utan någon bokstav före och/eller efter innebär att telefonnumret skall innehålla någonstans i sig för att spärras. Exempel: 789789. - Samtal från skyddade nummer, t.ex. abonnenter med hemligt nummer, spärras genom att ange A10B i spärrlistan.
- Samtal från abonnenter som ej är anslutna till en modern AXE-växel spärras genom att ange A00B i spärrlistan.
Observera att inget bindestreck skall anges mellan riktnummer och telefonnummer i nummerlistan!
Vill man rensa spärrlistan så klickar man på knappen "Rensa listan". Markören placeras automatiskt av programmet i listrutan för att man på nytt skall kunna mata in eventuella nummer som önskas spärras.
När man är klar med spärrlistan klickar man på knappen "Färdig".
Observera också att filnamnet som används av spärrlistan, LISTA.TXT, inte får användas av något annat program. - A
- Inställningar
De inställningar som kan göras i programmet rör vilken skrivarport som bygget är anslutet till, om man önskar loggning till en loggfil och i sådana fall vad loggfilen skall heta.
Eftersom programmet arbetar mycket nära hårdvaran och då särskilt skrivarportarna i datorn, så bör man ta reda på vilken adress som skrivarporten har som man har installerat bygget på. I annat fall är det bara att testa sig fram.
När man är klar med inställningarna så klickar man på knappen "Klar". - Spärra inga
Med denna funktion spärras inga inkommande samtal, oavsett om de finns i spärrlistan eller ej. - Spärra alla
Med denna funktion spärras alla inkommande samtal. Observera att bygget förlitar sig på telefonväxelns överföring av nummerpresentation för att detta skall fungera. Om nummerpresentationen av någon orsak inte skulle föras över från telefonväxeln så kommer det samtalet inte att spärras. - Spärra enl. lista
Med denna funktion kontrolleras alla inkommande samtal mot spärrlistan för att avgöra huruvida ett samtal skall spärras eller ej. Det är i detta läge som programmet startar. Denna funktion kan användas för att "återställa" programmets spärrningsfunktion efter att man har använt sig av funktionerna "Spärra inga" eller "Spärra alla". - Avsluta
Med detta alternativ avslutas programmet. - Menyn "Arkiv"
I denna meny finns alternativen "Om PhoneBlock", som visar lite information om upphovsmannen till programmet, samt "Avsluta", som har samma funktion som knappen "Avsluta" som beskrivits ovan.
6.3 Framtida utveckling
Följande skulle, i mån av tid, kunna läggas till:- Spärr av samtliga samtal under vissa tider samt vissa nummer som även under dessa tider kan komma fram (bra för eventuella nödsamtal från släktingar).
- Mer avancerade teckenfönster i programmet med klocka, datum och bläddringsfunktion för senast inkomna och utgående samtal.
Den fullständiga källkoden till programmet återfinns i bilaga 5.
7. NOTAPPARAT
1) Televerket 1992, i sin helhet2) Mitel 1985, s. 3-65
3) Hans Lundqvist 1994, s. 115-119
4) Bill Becwar 1991, rad 389-412
5) Jörgen Olsson, 199?
6) ELFA, 1996, s. 1072
7) ELFA, 1996, s. 1001
8) Philips, 1993, i sin helhet
9) ELFA, 1996, s. 1232
10) Critchley, 1994
11) ELFA, 1996, s. 946
12) Sharp, 199?, i sin helhet
13) Lakeview Research, 1996
8. RESULTAT
Bygget har kunnat möjliggöra spärrning av vissa samtal med hjälp av nummerpresentationen som finns tillgänglig i det svenska telenätet.
9. DISKUSSION
Med hjälp av byggen av den här typen kommer många att kunna slippa påringningar från personer som de inte önskar tala med. Bygget kan t.ex. hindra busringningar nattetid, medan samtal från alla andra släpps fram. Användningsområdet är mycket stort; endast användarens fantasi sätter gränserna.
10. SLUTSATSER
Byggen och applikationer av den här typen kommer förmodligen att kunna bli en stor framgång inom hemelektroniken inom en snar framtid. Alla som har tillgång till en dator skulle då kunna välja vilka samtal som får det att ringa i just deras telefon. Kanske en apparat per person i familjen, om varje person har ett eget telefonuttag, en egen apparat och en egen dator? Ingen omöjlighet med tanke på antalet datorer i de svenska hemmen, den stundande utvecklingen och möjligheten till masstillverkning av sådana produkter som t.ex. PhoneBlock.Att datorn dessutom kan hålla reda på tiden gör att ett helt nytt område öppnar sig, nämligen tidsstyrd samtalsblockering. Kanske vill man att samtal mitt i natten från äldre (som har vett att ringa på dessa tider endast om det är ett nödfall) skall komma fram men inte samtal från vänner och bekanta? Givetvis kan sådana detaljer ordnas - det är bara fråga om en vidareutveckling av programvaran!
11. ERKÄNNANDE
Jag vill rikta ett stort tack till min handledare Sven Persson som trots ett pressat tidsschema har åtagit sig att kika på framskridandet av detta specialarbete. Jag hoppas att arbetet kan ge en lärorik inblick i såväl teletekniken av idag samt byggen av hybridtyp såsom detta.Tack även till följande personer:
Min far, Leif Wiberg, utan vars hjälp vid felsökningarna av bygget detta arbete troligen inte hade kunnat presenteras.
Anders T (xmd18072@dredd.swipnet.se) för tips om timerkretsen 74HC5555P.
Jörgen Olsson (jorgen@kuai.se) för det arbete som i ett antal år har stått modell för DTMF-avkodning för datorbruk med kretsen MT8870B, vilket har inspirerat mig att sätta igång med arbetet.
Sid Knox (sbjknox@netsites.net) för tips om DLL-filer till Visual Basic som möjliggör in- och utmatning på parallellporten.
Jan Axelson (jaxelson@lvr.com), Lakeview Research, http://www.lvr.com, för ovan nämnda DLL-filer, INPOUT16.DLL respektive INPOUT32.DLL.
12 KÄLL- OCH LITTERATURFÖRTECKNING
1) Televerket, 1992, Televerkets specifikation 8211-A331 - överföring av nummerinformation över analog ledning vid ankommande trafik
2) Mitel, 1985, Mitel MT8870 integrated DTMF receiver
(datablad från ELFA:s hämtfax, artikelnummer 73-036-21)
3) Hans Lundqvist och Liber Utbildning AB, 1994, Teknologi B del 2, ISBN 91-634-0691-8
4) Bill Becwar (CompuServe 72060,251), 1991, Quick guide to computer cables
5) Jörgen Olsson (jorgen@kuai.se eller Jorgen Olsson på Fidonet 2:205/201), 199?, kopplingsschema over caller id enhet.
6) ELFA, 1996, ELFA-katalogen nummer 45 1996/1997, Telefonkretsar, LS1240A - elektronisk signalgivare
7) ELFA, 1996, ELFA-katalogen nummer 45 1996/1997, Timerkretsar, 74HC5555 - programmerbar timer (datablad från ELFA:s hämtfax, artikelnummer 73-555-55)
8) Philips, 1993, Philips IC06 Integrated Circuits, 74HC/HCT5555 - programmable delay timer with oscillator
9) ELFA, 1996, ELFA-katalogen nummer 45 1996/1997, Linjetransformatorer för telekommunikation, CWC9000
10) Critchley, 1994, CWC9000 line isolating transformer
(datablad från ELFA:s hämtfax, artikelnummer 55-670-01)
11) ELFA, 1996, ELFA-katalogen nummer 45 1996/1997, Optokomponenter, PC847 - optokopplare
12) Sharp, 199?, PC817 High Density Mounting Type Photocoupler
(datablad från ELFA:s hämtfax, artikelnummer 75-350-32)
13) Lakeview Research, 1996, INPOUT16.DLL
Filen finns för nedladdning från Internet på adressen http://www.lvr.com/inpout16.zip. Om sidan inte skulle finnas kvar, leta då på http://www.lvr.com/parport.htm#Programming eller http://www.lvr.com.
Anmärkning: ELFA:s hämtfax har telefonnummer 08-7353533. För att använda hämtfaxfunktionen behöver du en telefon av tonvalstyp och en faxmaskin.
Bil. BILAGOR
Bil. 1 Timerkretsen 74HC5555 (utdrag ur datablad)
Bild 1 IC 74HC/HCT5555
Bild 2 IC 74HC/HCT5555
Bild 3 IC 74HC/HCT5555
Bild 4 IC 74HC/HCT5555
Bild 5 IC 74HC/HCT5555
Bild 6 IC 74HC/HCT5555
Bil. 2 Komponentlista
ELFA art. nr. | Komponent | Antal | Pris/st | Totalt |
---|---|---|---|---|
73-036-21 | IC MT8870B | 1 | 29:65 | 29:65 |
73-036-13 | IC LS1240A | 1 | 12:10 | 12:10 |
73-555-55 | IC 74HC5555P | 1 | 16:80 | 16:80 |
73-685-74 | (1/4) IC 74LS32 | 1 | 3:10 | 3:10 |
73-685-17 | (1/4) IC 74LS09 | 1 | 3:10 | 3:10 |
73-502-26 | IC 74HCT04 | 2 | 2:95 | 5:90 |
75-350-32 | Optokopplare PC847 | 2 | 25:25 | 50:50 |
48-120-12 | IC-hållare 8-pin DIL | 1 | 2:45 | 2:45 |
48-120-53 | IC-hållare 14-pin DIL | 4 | 4:30 | 17:20 |
48-120-95 | IC-hållare 16-pin DIL | 3 | 4:90 | 14:70 |
48-121-37 | IC-hållare 18-pin DIL | 1 | 5:50 | 5:50 |
56-670-01 | Linjetransformator CWC9000 | 1 | 29:95 | 29:95 |
74-501-41 | Mikroprocessorkristall 3.58 MHz | 1 | 11:10 | 11:10 |
60-103-91 | Kolytskiktsmotstånd 150 W | 2 | 1:00 | 2:00 |
60-719-48 | Metallfilmsmotstånd 510 W | 1 | 1:00 | 1:00 |
60-104-74 | Kolytskiktsmotstånd 680 W | 7 | 1:00 | 7:00 |
60-104-90 | Kolytskiktsmotstånd 1 kW | 1 | 1:00 | 1:00 |
60-105-24 | Kolytskiktsmotstånd 1.8 kW | 1 | 1:00 | 1:00 |
60-726-23 | Metallfilmsmotstånd 2.1 kW | 1 | 1:00 | 1:00 |
60-105-32 | Kolytskiktsmotstånd 2.2 kW | 1 | 1:00 | 1:00 |
60-105-40 | Kolytskiktsmotstånd 2.7 kW | 1 | 1:00 | 1:00 |
60-106-31 | Kolytskiktsmotstånd 15 kW | 1 | 1:00 | 1:00 |
60-738-52 | Metallfilmsmotstånd 24.9 kW | 1 | 1:00 | 1:00 |
60-106-72 | Kolytskiktsmotstånd 33 kW | 5 | 1:00 | 5:00 |
60-742-15 | Metallfilmsmotstånd 49.9 kW | 1 | 1:00 | 1:00 |
60-107-30 | Kolytskiktsmotstånd 100 kW | 2 | 1:00 | 2:00 |
60-107-55 | Kolytskiktsmotstånd 150 kW | 2 | 1:00 | 2:00 |
65-037-00 | Kondensator 1 nF | 1 | 2:60 | 2:60 |
65-226-84 | Kondensator 100 nF | 5 | 1:60 | 6:40 |
65-227-42 | Kondensator 330 nF | 1 | 3:35 | 3:35 |
65-398-86 | Kondensator 4.7 mF | 1 | 35:00 | 35:00 |
67-807-79 | Elektrolytkondensator 10 mF 50 V | 1 | 2:60 | 2:60 |
67-014-29 | Elektrolytkondensator 470 mF 50 V | 1 | 6:95 | 6:95 |
70-005-16 | Diod 1N4007 | 2 | 0:85 | 1:70 |
71-039-55 | Transistor BC548C | 1 | 1:55 | 1:55 |
73-090-08 | Spänningsregulator 7805UC/ST | 1 | 12:05 | 12:05 |
35-305-16 | Vippströmställare miniatyr 1-polig | 1 | 11:20 | 11:20 |
44-055-77 | Kontakt DSUB 25-polig hane | 1 | 7:80 | 7:80 |
44-093-71 | Kontaktkåpa DSUB 25 | 1 | 13:70 | 13:70 |
75-038-24 | Lysdiod grön 5 mm diameter | 1 | 3:15 | 3:15 |
75-038-32 | Lysdiod röd 5 mm diameter | 1 | 3:40 | 3:40 |
75-029-09 | Panelhållare lysdiod 5 mm 10-pack | 1 | 14:10 | 14:10 |
37-043-50 | Relä 2-poligt, 2 A, 5 V polspänning | 1 | 29:40 | 29:40 |
50-553-71 | Låda med gavelpanel A9040065 | 1 | 116:00 | 116:00 |
55-716-82 | Kabel skärmad 8-ledare | 2 m | 17:50 | 35:00 |
55-740-17 | Telefonkabel 4-ledare | 3 m | 8:95 | 26:85 |
55-452-07 | Kopplingskabel enkelledare | 1 m | 8:00 | 8:00 |
55-023-64 | Kabelförskruvning M16x1.5 4-8 mm diameter | 1 | 8:75 | 8:75 |
55-023-72 | Kabelförskruvning M20x1.5 6-12 mm diameter | 1 | 12:80 | 12:80 |
55-024-63 | Kontramutter M16x1.5 | 1 | 3:20 | 3:20 |
55-024-71 | Kontramutter M20x1.5 | 1 | 3:60 | 3:60 |
48-396-76 | Experimentkort 10x16 cm | 1 | 55:00 | 55:00 |
69-814-43 | Batterieliminator 9 V DC 700 mA | 1 | 278:00 | 278:00 |
42-680-25 | Mellanpropp (tele) | 1 | 33:00 | 33:00 |
42-692-54 | Plugg-kabelskor-kablage, rakt, 4/4 poler | 1 | 14:55 | 14:55 |
Totalt exklusive moms | 978:15 | |||
Moms | 244:54 | |||
Totalt inklusive moms | 1222:69 |
Bil. 3 Kopplingsschema
Klicka här för att se bilden.
Bil. 4 Källkod till programmet för att läsa parallellportens status
Filnamn: TEST.CPP
// TEST.CPP
// Programmet läser parallellportarnas status (LPT1-LPT3) och visar vilka bitar
// som är satta på statusregistret för varje port. Dessutom ettställs alla 8 bitar
// på datautgångarna för kontroll av dessa, mätningar eller dylikt.
#include
#include
#include
#include
void main(void)
{
int resultat;
// Adresserna för de olika registren (decimalt)
// Port Data Status Kontroll
// LPT1 956 957 958
// LPT2 888 889 890
// LPT3 632 633 634
int ut[3]= {956,888, 632}; // Portadresserna för datautgångarna
int status[3] = {957,889,633}; // Portadresserna för statusregistren
int kontroll[3]= {958,890, 634}; // Portadresserna för kontrollregistren
int varde[3]= {255,255,255}; // Värden att skicka ut på datautgångarna
int div, i, y;
for (i=0; i<3; i++) {
outportb(ut[i],varde[i]); // Skicka data till datautgångarna
}
while (!kbhit()) { // Utför tills tangent trycks
clrscr();
for (y=0; y<3; y++) {
cout << "Avläsning av statusregistret på LPT" << y+1 << endl << endl;
resultat = inportb(status[y]);
cout << "Portadress till registret: " << status[y] << endl;
cout << "Decimalt: " << resultat << " Binärt: ";
// Skriv ut bitarna
for (i=7; i>=0; i--) {
div=resultat/pow(2,i);
if (div!=0) resultat-=pow(2,i);
cout << div;
}
cout << endl << endl;
}
delay(100); // Fördröjning mellan varje uppdatering
}
}
Bil. 5 Källkod till programmet PhoneBlock
Filnamn: PBLOCK.VBP
Form=HUVUDPRO.FRM
Module=Module; MODULE.BAS
Form=SPARRLIS.FRM
Form=INSTALLN.FRM
Form=OM.FRM
ProjWinSize=82,830,194,128
ProjWinShow=2
IconForm="Huvudprogram"
HelpFile=""
Title="PhoneBlock v1.0"
ExeName="PBLOCK.EXE"
Name="PhoneBlock"
HelpContextID="0"
StartMode=0
VersionCompatible="0"
MajorVer=1
MinorVer=0
RevisionVer=0
AutoIncrementVer=0
ServerSupportFiles=0
VersionLegalCopyright="(C) Björn Wiberg 1997-1998"
VersionProductName="PhoneBlock"
Filnamn: HUVUDPRO.FRM
VERSION 4.00
Begin VB.Form Huvudprogram
BorderStyle = 1 'Fixed Single
Caption = "PhoneBlock v1.0"
ClientHeight = 3375
ClientLeft = 1095
ClientTop = 1830
ClientWidth = 4695
ControlBox = 0 'False
Height = 4065
Icon = "HUVUDPRO.frx":0000
Left = 1035
LinkTopic = "Form1"
MaxButton = 0 'False
MinButton = 0 'False
ScaleHeight = 3375
ScaleWidth = 4695
Top = 1200
Width = 4815
Begin VB.Frame Frame_Funktioner
Caption = "Funktioner"
Height = 1215
Left = 120
TabIndex = 0
Top = 2040
Width = 4455
Begin VB.CommandButton Knapp_Sparra_enligt_lista
Caption = "Spärra enl. lista"
Height = 375
Left = 3000
TabIndex = 6
Top = 720
Width = 1335
End
Begin VB.CommandButton Knapp_Sparra_alla
Caption = "Spärra alla"
Height = 375
Left = 1560
TabIndex = 5
Top = 720
Width = 1335
End
Begin VB.CommandButton Knapp_Sparra_inga
Caption = "Spärra inga"
Height = 375
Left = 120
TabIndex = 4
Top = 720
Width = 1335
End
Begin VB.CommandButton Knapp_Installningar
Caption = "Inställningar"
Height = 375
Left = 1560
TabIndex = 2
Top = 240
Width = 1335
End
Begin VB.CommandButton Knapp_Avsluta
Caption = "Avsluta"
Height = 375
Left = 3000
TabIndex = 3
Top = 240
Width = 1335
End
Begin VB.CommandButton Knapp_Sparrlista
Caption = "Spärrlista"
Height = 375
Left = 120
TabIndex = 1
Top = 240
Width = 1335
End
End
Begin VB.Frame Frame_Status
Caption = "Status"
Height = 1815
Left = 120
TabIndex = 7
Top = 120
Width = 4455
Begin VB.Timer Timer_Vanta
Enabled = 0 'False
Interval = 1
Left = 3960
Top = 600
End
Begin VB.Timer Timer_Sparra
Enabled = 0 'False
Interval = 1000
Left = 3960
Top = 120
End
Begin VB.TextBox Textruta_Info
Alignment = 2 'Center
Height = 375
Left = 240
Locked = -1 'True
MultiLine = -1 'True
TabIndex = 9
TabStop = 0 'False
Top = 1200
Width = 3975
End
Begin VB.TextBox Textruta_Display
Alignment = 2 'Center
BeginProperty Font
name = "MS Sans Serif"
charset = 0
weight = 700
size = 18
underline = 0 'False
italic = 0 'False
strikethrough = 0 'False
EndProperty
Height = 735
Left = 240
Locked = -1 'True
MultiLine = -1 'True
TabIndex = 8
TabStop = 0 'False
Top = 360
Width = 3975
End
End
Begin VB.Menu Meny_Arkiv
Caption = "Arkiv"
Begin VB.Menu Meny_Om_PhoneBlock
Caption = "&Om PhoneBlock"
End
Begin VB.Menu Meny_Avsluta
Caption = "&Avsluta"
End
End
End
Attribute VB_Name = "Huvudprogram"
Attribute VB_Creatable = False
Attribute VB_Exposed = False
Option Explicit
Rem PhoneBlock - samtalsblockering med nummerpresentation
Rem (C) Björn Wiberg 1997-1998
Rem Deklarationer för inpout-DLL-filen
Private Declare Function Inp Lib "inpout16.dll" Alias "Inp16" _
(ByVal PortAddress As Integer) As Integer
Private Declare Sub Out Lib "inpout16.dll" Alias "Out16" _
(ByVal PortAddress As Integer, ByVal Value As Integer)
Private Sub Form_Load()
Rem Spärra samtal enligt spärrlista som standard
Sparra_samtal = 1
Rem Vänta tills programmet är konfigurerat
Konfigurerat = False
Rem Läs konfigurationsfilen till programmet
Las_konfiguration
Rem Vänta tills konfigurationen är inläst
Vanta_konfiguration
Rem Ettställ pin 3 på parallellporten som standard
Rem (Används som strömförsörjning i en del av bygget)
Value = 2
Out PortAddress, Value
Loggfil_text = "PhoneBlock startades (portadress" + Str$(PortAddress) + ")."
Logga
Rem Visa formuläret
Huvudprogram.Show
Rem Uppdatera programmets displayer
Textruta_Display.Text = "Inget nummer"
start:
Rem Vänta på samtal
Vanta_samtal = 0
Vanta_pa_samtal
Rem Vänta tills vänta-på-samtalsproceduren är klar
Do Until Vanta_samtal = True
DoEvents
Loop
Rem Om inget fel vid mottagningen av numret skedde,
Rem kolla upp det och eventuellt spärra det
If Fel_vid_inlasning = 0 Then
Rem Rensa bort eventuella mellanslag på slutet av numret
Do Until Right$(Nummer, 1) <> " " Or Len(Nummer) = 0
Nummer = Left$(Nummer, Len(Nummer) - 1)
Loop
Rem Uppdatera displayen med numret och lägg till start- och
Rem slutbokstäver till numret (A respektive B)
Textruta_Display.Text = Nummer
If Nummer = "00" Then Textruta_Display.Text = "Okänt nummer"
If Nummer = "10" Then Textruta_Display.Text = "Skyddat nummer"
Rem Inkommande samtal skall loggas
Loggfil_text = "Inkommande samtal: " + Textruta_Display.Text
Logga
Nummer = "A" + Nummer + "B"
Kolla_nummer
Else
Rem Om utgående samtal
If Inkommande_samtal = 0 Then
Loggfil_text = "Utg†ende samtal detekterat: " + Nummer
Logga
Else
Rem Inkommande samtal men fel vid inläsningen av nummerpresentationen
Loggfil_text = "Fel vid nummermottagning detekterat: " + Nummer
Logga
End If
End If
GoTo start
End Sub
Private Sub Knapp_Avsluta_Click()
Rem Vi ville avsluta programmet
Avslut
End Sub
Private Sub Knapp_Installningar_Click()
Rem Logga
Loggfil_text = "Anv„ndaren gick in i inst„llningarna."
Logga
Rem Öppna konfigurationsformuläret
Installningar.Show
Rem Markera knappen "Klar" i inställningsrutan
Installningar.Installningar_Knapp_Klar.SetFocus
Rem Vänta tills konfigurationen är klar
Konfigurerat = 0
Vanta_konfiguration
End Sub
Private Sub Knapp_Sparra_alla_Click()
Rem Logga
Loggfil_text = "Anv„ndaren valde att alla samtal skall sp„rras."
Logga
Sparra_samtal = 2
Textruta_Info.Text = "Alla inkommande samtal spärras."
Timer_lang_klar = 0
Vanta_lang_tid
Do Until Timer_lang_klar = True
DoEvents
Loop
End Sub
Private Sub Knapp_Sparra_enligt_lista_Click()
Rem Logga
Loggfil_text = "Anv„ndaren valde att samtal skall sp„rras enligt sp„rrlistan."
Logga
Sparra_samtal = 1
Textruta_Info.Text = "Samtal spärras nu enligt spärrlistan."
Timer_lang_klar = 0
Vanta_lang_tid
Do Until Timer_lang_klar = True
DoEvents
Loop
End Sub
Private Sub Knapp_Sparra_inga_Click()
Rem Logga
Loggfil_text = "Anv„ndaren valde att inga samtal skall sp„rras."
Logga
Sparra_samtal = 0
Textruta_Info.Text = "Inga samtal kommer att spärras."
Timer_lang_klar = 0
Vanta_lang_tid
Do Until Timer_lang_klar = True
DoEvents
Loop
End Sub
Private Sub Knapp_Sparrlista_Click()
Rem Logga
Loggfil_text = "Anv„ndaren gick in i sp„rrlistan."
Logga
Rem Visa spärrlistan
Sparrlista.Show
Rem Ställ markören i spärrlisterutan
Sparrlista.Sparrlista_Nummerlista.SetFocus
End Sub
Public Sub Vanta_pa_samtal()
Rem Visa i displayen att vi väntar på ett samtal
Textruta_Info.Text = "Väntar på inkommande samtal."
Rem Rensa variabeln för inläst nummer
Nummer = ""
Rem Inget fel vid inläsningen ännu
Fel_vid_inlasning = 0
Rem Anropar en procedur som väntar hur länge som
Rem helst på att en ny siffra detekterats
Max_sekund = 0
Vanta_pa_vad = True
Siffra_klar = 0
Vanta_pa_ny_siffra
Do Until Siffra_klar = True
DoEvents
Loop
Rem Vi är inte färdiga med nummerinläsningen än...
Fardig_med_nummerinlasning = 0
Do Until Fardig_med_nummerinlasning = True
Rem Ny siffra har detekterats!
Rem Om siffran är ett B så är detta ett inkommande samtal
If Siffra = 14 Then
Nummer = ""
Inkommande_samtal = True
Else
Rem Annars är det ett utgående samtal - se upp med 'defaultsatt' siffra
Rem från bitviktsavläsningsproceduren, nämligen variabeln Siffra=0
If Siffra <> 0 Then
Inkommande_samtal = False
Rem Siffrorna 1-9 fungerar som vanligt
If Siffra >= 0 And Siffra < 10 Then
Nummer = Nummer + Right$(Str$(Siffra), 1)
Else
Rem Siffran 0 samt * och # hanteras för sig
Select Case Siffra
Case 10
Nummer = Nummer + "0"
Case 11
Nummer = Nummer + "*"
Case 12
Nummer = Nummer + "#"
End Select
End If
Rem Uppdatera displayen om det är normala siffror
If Siffra >= 0 And Siffra <= 12 Then Textruta_Display.Text = Nummer
End If
End If
Rem Läs nu siffror till dess att 'slutsiffran' C har
Rem kommit in eller det att mer än en sekund gått sedan
Rem senast inlästa siffran, dvs något gick fel
Do Until Siffra = 15 Or Fardig_med_nummerinlasning = True Or Fel_vid_inlasning = True
Rem Vänta nu på att siffran 'har upphört' innan vi tar emot nästa
Rem Annars skulle samma siffra läsas in flera gånger
Max_sekund = True
Vanta_pa_vad = 0
Siffra_klar = 0
Vanta_pa_ny_siffra
Do Until Siffra_klar = True
DoEvents
Loop
Rem Detta talar om för Vanta_pa_ny_siffra att max en sekund får gå!
Max_sekund = True
Vanta_pa_vad = True
Siffra_klar = 0
Vanta_pa_ny_siffra
Do Until Siffra_klar = True
DoEvents
Loop
Rem Om vi fick in en siffra inom en sekund...
If Fel_vid_inlasning = 0 Then
Rem Siffrorna 1-9 fungerar som vanligt
If Siffra >= 0 And Siffra < 10 Then
Nummer = Nummer + Right$(Str$(Siffra), 1)
Else
Rem Siffran 0 samt * och # hanteras för sig
Select Case Siffra
Case 10
Nummer = Nummer + "0"
Case 11
Nummer = Nummer + "*"
Case 12
Nummer = Nummer + "#"
End Select
End If
Rem Uppdatera displayen
Textruta_Display.Text = Nummer
End If
Loop
Rem Om något gick fel, en ny siffra kom inte inom en sekund...
If Fel_vid_inlasning = True Then Fardig_med_nummerinlasning = True
Rem Om vi fick vårt C som sista siffra så var numret komplett
If Siffra = 15 Then Fardig_med_nummerinlasning = True
Rem Fortsätt tills vi är färdiga med nummerinläsningen
DoEvents
Loop
Rem Vänta nu på att siffran 'har upphört' innan vi tar emot nästa
Rem Annars skulle samma siffra läsas in flera gånger
Max_sekund = 0
Vanta_pa_vad = 0
Siffra_klar = 0
Vanta_pa_ny_siffra
Do Until Siffra_klar = True
DoEvents
Loop
Rem Tala om för resten av programmet att vi är klara
Vanta_samtal = True
End Sub
Public Sub Vanta_pa_ny_siffra()
Rem Anmärkning: proceduren kan antingen vänta på att
Rem en ny siffra kommit in eller på att en inkommen
Rem siffra ej längre hörs i luren, beroende på värdet
Rem på variabeln Vanta_pa_vad
Rem Om variabeln Max_sekund är ettställd då denna procedur
Rem körs, så vill vi inte vänta för evigt på en
Rem ny siffra utan max en sekund, se då till att kolla
Rem den timern också!
Rem Se till att läsa in från parallellporten
Bitvikt_klar = 0
Bitvikt
Do Until Bitvikt_klar = True
Timer_kort_klar = 0
Vanta_kort_tid
Do Until Timer_kort_klar = True
DoEvents
Loop
DoEvents
Loop
Rem Vänta för evigt på ny siffra
If Max_sekund = 0 Then
Rem Läs till dess att ny siffra detekterats
Do Until Bitar(8) = Vanta_pa_vad
Bitvikt_klar = 0
Bitvikt
Do Until Bitvikt_klar = True
DoEvents
Loop
Timer_kort_klar = 0
Vanta_kort_tid
Do Until Timer_kort_klar = True
DoEvents
Loop
DoEvents
Loop
Else
Rem Vänta max en sekund på ny siffra
Rem Läs till dess att ny siffra detekterats eller en sekund har gått
Rem Starta om ensekundstimern
Timer_Sparra.Enabled = False
Do Until Timer_Sparra.Enabled = False
DoEvents
Loop
Timer_Sparra.Enabled = True
Do Until Bitar(8) = Vanta_pa_vad Or Timer_Sparra.Enabled = False
Bitvikt_klar = 0
Bitvikt
Do Until Bitvikt_klar = True
DoEvents
Loop
Timer_kort_klar = 0
Vanta_kort_tid
Do Until Timer_kort_klar = True
DoEvents
Loop
DoEvents
Loop
Rem Om det tog för lång tid, visa det med variabeln Fel_vid_inlasning
If Timer_Sparra.Enabled = False Then
Fel_vid_inlasning = True
Else
Fel_vid_inlasning = 0
End If
End If
Rem Signalera om att vi är klara
Siffra_klar = True
End Sub
Public Sub Vanta_kort_tid()
Rem Vänta ett visst intervall (10 ms)
Timer_Vanta.Enabled = False
Timer_Vanta.Enabled = True
Do Until Timer_Vanta.Enabled = False
DoEvents
Loop
Rem Signalera att vi är klara
Timer_kort_klar = True
End Sub
Public Sub Vanta_lang_tid()
Rem Vänta ett visst intervall (1000 ms)
Timer_Sparra.Enabled = False
Timer_Sparra.Enabled = True
Do Until Timer_Sparra.Enabled = False
DoEvents
Loop
Rem Signalera att vi är klara
Timer_lang_klar = True
End Sub
Public Sub Bitvikt()
Rem Läser värdet från portens statusregister
temp = Inp(PortAddress + 1)
Rem Nollställ arrayen Bitar
For i = 1 To 8
Bitar(i) = 0
Next i
Rem Sätt bitarna i arrayen
For i = 8 To 1 Step -1
If (temp - (2 ^ (i - 1))) >= 0 Then
Bitar(i) = 1
temp = temp - (2 ^ (i - 1))
End If
Next i
Rem Bit 7 skall inverteras (pinne 11 på parallellporten)
If Bitar(8) = 0 Then Bitar(8) = True Else Bitar(8) = 0
Rem Summera ihop bitarna 4-7 (bitvikt 8-128) vilka utgör inläst siffra
Siffra = 0
For i = 4 To 7
If Bitar(i) = True Then Siffra = Siffra + (2 ^ (i - 3 - 1))
Next i
Rem Signalera om att vi är klara med bitviktsavläsningen
Bitvikt_klar = True
End Sub
Public Sub Kolla_nummer()
Rem Kolla om samtalet skall spärras
Select Case Sparra_samtal
Case 0
Rem Inga samtal spärras
Case 1
Rem Spärra enligt spärrlista - kolla också om spärrlistan är tom
If Sparrlista.Sparrlista_Nummerlista.Text <> "" Then
Rem Uppdatera variabeln som till sist, efter genomgång av
Rem spärrlistan, skall avgöra om vi skall spärra samtalet eller ej
Sparra_samtalet = False
Rem Lägg spärrlistan i en temporär variabel
Hela_listan = Sparrlista.Sparrlista_Nummerlista.Text
Rem Bearbeta alla rader som har ett radslut
Do Until InStr(Hela_listan, Chr$(13)) = 0
Rem Ta ut ett nummer i taget
Nummerfragment = Left$(Hela_listan, InStr(Hela_listan, Chr$(13)) - 1)
Rem Ta bort eventuella linefeeds och inledande blanksteg
Do Until Left$(Nummerfragment, 1) <> Chr$(10) And Left$(Nummerfragment, 1) <> Chr$(32)
Nummerfragment = Right$(Nummerfragment, Len(Nummerfragment) - 1)
Loop
Rem Ta bort detta nummer från den temporära variabeln
Hela_listan = Right$(Hela_listan, Len(Hela_listan) - InStr(Hela_listan, Chr$(13)))
If Len(Nummerfragment) > 0 Then
Rem Kolla förekomsten av raden i telefonnumret
If InStr(Nummer, Nummerfragment) > 0 Then Sparra_samtalet = True
End If
Loop
Rem Inga fler radslut - men kanske ett nummer till om den
Rem temporära variabelns längd inte är noll
Rem Ta bort eventuella linefeeds och inledande blanksteg först,
Rem kolla sedan längden på strängen
Do Until Left$(Hela_listan, 1) <> Chr$(10) And Left$(Hela_listan, 1) <> Chr$(32)
Hela_listan = Right$(Hela_listan, Len(Hela_listan) - 1)
Loop
If Len(Hela_listan) > 0 Then
If InStr(Nummer, Hela_listan) > 0 Then Sparra_samtalet = True
Rem Slut på kontrollen av rad utan radslut
End If
Rem Spärra samtalet om variabeln Sparra_samtalet
Rem är ettställd
If Sparra_samtalet = True Then
Sparra_samtalet = False
Sparra
End If
Rem Slut på kontrollen om spärrlistan var tom
End If
Case 2
Rem Alla samtal spärras
Sparra
End Select
End Sub
Public Sub Sparra()
Rem Spärrar ett samtal genom att skicka värdet 3
Rem till parallellportens datautgångar, dvs pin 2
Rem och 3 ettställs i en sekund
Textruta_Info.Text = "Samtalet spärras!"
Value = 3
Out PortAddress, Value
Rem Logga att samtalet spärrats
Loggfil_text = "Samtalet sp„rrades."
Logga
Rem Vänta tills spärrsignalen skickats i en sekund
Do Until Timer_Sparra.Enabled = False
DoEvents
Loop
Rem Efter spärren skall endast pin 3 vara ettställd
Rem (Används som strömförsörjning i en del av bygget)
Value = 2
Out PortAddress, Value
End Sub
Private Sub Meny_Avsluta_Click()
Rem Avsluta programmet
Avslut
End Sub
Private Sub Meny_Om_PhoneBlock_Click()
Rem Logga
Loggfil_text = "Anv„ndaren valde Om PhoneBlock-menyn."
Logga
Om_PhoneBlock.Show
End Sub
Private Sub Timer_Sparra_Timer()
Timer_Sparra.Enabled = False
DoEvents
End Sub
Private Sub Timer_Vanta_Timer()
Timer_Vanta.Enabled = False
DoEvents
End Sub
Filnamn: INSTALLN.FRM VERSION 4.00
Begin VB.Form Installningar
BorderStyle = 1 'Fixed Single
Caption = "Inställningar"
ClientHeight = 1695
ClientLeft = 1095
ClientTop = 1515
ClientWidth = 7935
ControlBox = 0 'False
Height = 2100
Icon = "INSTALLN.frx":0000
Left = 1035
LinkTopic = "Form1"
MaxButton = 0 'False
MinButton = 0 'False
ScaleHeight = 1695
ScaleWidth = 7935
Top = 1170
Width = 8055
Begin VB.Frame Installningar_Frame_Instruktioner
Caption = "Instruktioner"
Height = 1455
Left = 5520
TabIndex = 7
Top = 120
Width = 2295
Begin VB.CommandButton Installningar_Knapp_Klar
Caption = "Klar"
Height = 375
Left = 120
TabIndex = 8
Top = 960
Width = 2055
End
Begin VB.Label Installningar_Text_Instruktioner_1
Caption = $"INSTALLN.frx":0442
Height = 615
Left = 120
TabIndex = 10
Top = 240
Width = 2055
End
End
Begin VB.Frame Installningar_Frame_Loggfil
Caption = "Loggfil"
Height = 1455
Left = 2280
TabIndex = 4
Top = 120
Width = 3135
Begin VB.CheckBox Installningar_Loggfil_Anvand_loggfil
Caption = "Använd loggfil"
Height = 375
Left = 120
TabIndex = 5
Top = 240
Width = 1455
End
Begin VB.TextBox Installningar_Loggfil_Filnamn
Height = 375
Left = 120
TabIndex = 6
Top = 960
Width = 2895
End
Begin VB.Label Installningar_Text_Filnamn
Caption = "Filnamn:"
Height = 255
Left = 120
TabIndex = 9
Top = 720
Width = 735
End
End
Begin VB.Frame Installningar_Frame_Skrivarport
Caption = "Skrivarport"
Height = 1455
Left = 120
TabIndex = 0
Top = 120
Width = 2055
Begin VB.OptionButton Installningar_Skrivarport_LPT1
Caption = "LPT1 (Adress 378h)"
Height = 375
Left = 120
TabIndex = 1
Top = 240
Width = 1815
End
Begin VB.OptionButton Installningar_Skrivarport_LPT3
Caption = "LPT3 (Adress 3BCh)"
Height = 375
Left = 120
TabIndex = 3
Top = 960
Width = 1815
End
Begin VB.OptionButton Installningar_Skrivarport_LPT2
Caption = "LPT2 (Adress 278h)"
Height = 375
Left = 120
TabIndex = 2
Top = 600
Width = 1815
End
End
End
Attribute VB_Name = "Installningar"
Attribute VB_Creatable = False
Attribute VB_Exposed = False
Private Sub Installningar_Loggfil_Anvand_loggfil_Click()
Rem Om kryssrutan är markerad så vill vi använda oss av en loggfil
If Installningar_Loggfil_Anvand_loggfil.Value = 1 Then
Anvand_loggfil = True
Else
Anvand_loggfil = False
End If
Rem Stäng loggfilen om den är öppen
Close #1
End Sub
Private Sub Installningar_Skrivarport_LPT1_Click()
PortAddress = &H378
Installningar_Skrivarport_LPT2.Value = False
Installningar_Skrivarport_LPT3.Value = False
End Sub
Private Sub Installningar_Skrivarport_LPT2_Click()
PortAddress = &H278
Installningar_Skrivarport_LPT1.Value = False
Installningar_Skrivarport_LPT3.Value = False
End Sub
Private Sub Installningar_Skrivarport_LPT3_Click()
PortAddress = &H3BC
Installningar_Skrivarport_LPT1.Value = False
Installningar_Skrivarport_LPT2.Value = False
End Sub
Private Sub Installningar_Knapp_Klar_Click()
Rem Kontrollera att, om loggfil valts, rutan ej är tom
If Installningar_Loggfil_Anvand_loggfil.Value = 1 _
And Installningar_Loggfil_Filnamn.Text = "" Then
temp = MsgBox("Du måste välja ett filnamn för loggfilen, " _
eller välja att inte använda någon loggfil.", 0, "PhoneBlock")
GoTo slut
End If
Rem Stäng formuläret
Installningar.Hide
Rem Ange att konfigurationen inte är sparad
Konfiguration_sparad = False
Rem Spara konfigurationen
Spara_konfiguration
Rem Vänta på att konfigurationen blir sparad
Vanta_konfiguration_sparad
Rem Programmet är inte konfigurerat än
Konfigurerat = False
Rem Läs konfigurationsfilen - eventuella fel upptäcks
Rem då, som t.ex. felaktigt angivet loggfilsnamn
Las_konfiguration
Rem Vänta tills konfigurationen är inläst
Vanta_konfiguration
Rem Logga sparandet av konfigurationen
Loggfil_text = "Inst„llningarna sparades."
Logga
slut:
End Sub
Public Sub Spara_konfiguration()
On Error GoTo fel
Open "pblock.cfg" For Output As #2
Rem Första raden - val av parallellport
Select Case PortAddress
Case &H378
Print #2, "1"
Case &H278
Print #2, "2"
Case &H3BC
Print #2, "3"
Case Else
End Select
Rem Andra raden - använd loggfil eller ej
If Anvand_loggfil = True Then
Print #2, "1"
Print #2, Installningar_Loggfil_Filnamn.Text
Else
Print #2, "0"
Print #2, ""
End If
Rem Stäng filen
Close #2
Rem Avsluta
GoTo slut
fel:
Rem Kunde inte spara konfigurationsfilen
temp = MsgBox("Kunde inte spara konfigurationsfilen. Programmet kommer att avslutas.", 0, "PhoneBlock")
Rem Meddela om att vi är klara
Konfiguration_sparad = True
Rem Avsluta programmet
Avslut
slut:
Rem Meddela om att vi är klara
Konfiguration_sparad = True
End Sub
Filnamn: SPARRLIS.FRM
VERSION 4#
Begin VB.Form Sparrlista
BorderStyle = 1 'Fixed Single
Caption = "Spärrlista"
ClientHeight = 4455
ClientLeft = 3855
ClientTop = 3585
ClientWidth = 5535
ControlBox = 0 'False
Height = 4860
Icon = "SPARRLIS.frx":0000
Left = 3795
LinkTopic = "Form1"
MaxButton = 0 'False
MinButton = 0 'False
ScaleHeight = 4455
ScaleWidth = 5535
Top = 3240
Width = 5655
Begin VB.Frame Frame_Sparrlista_Instruktioner
Caption = "Instruktioner"
Height = 4215
Left = 3120
TabIndex = 2
Top = 120
Width = 2295
Begin VB.CommandButton Knapp_Sparrlista_Fardig
Caption = "Färdig"
Height = 375
Left = 120
TabIndex = 4
Top = 3720
Width = 2055
End
Begin VB.CommandButton Knapp_Sparrlista_Rensa_listan
Caption = "Rensa listan"
Height = 375
Left = 120
TabIndex = 3
Top = 3240
Width = 2055
End
Begin VB.Label Text_Sparrlista_Instruktioner_4
Caption = "Klicka på 'Färdig' när du är klar med spärrlistan."
Height = 495
Left = 120
TabIndex = 8
Top = 2280
Width = 2055
End
Begin VB.Label Text_Sparrlista_Instruktioner_3
Caption = $"SPARRLIS.frx":0442
Height = 615
Left = 120
TabIndex = 7
Top = 1560
Width = 2055
End
Begin VB.Label Text_Sparrlista_Instruktioner_2
Caption = "Mata endast in ett nummer per rad."
Height = 495
Left = 120
TabIndex = 6
Top = 960
Width = 2055
End
Begin VB.Label Text_Sparrlista_Instruktioner_1
Caption = "Mata in de nummer du vill spärra i rutan till vänster."
Height = 495
Left = 120
TabIndex = 5
Top = 360
Width = 2055
End
End
Begin VB.Frame Frame_Sparrlista
Caption = "Nummer att spärra"
Height = 4215
Left = 120
TabIndex = 0
Top = 120
Width = 2895
Begin VB.TextBox Sparrlista_Nummerlista
Height = 3855
Left = 120
MultiLine = -1 'True
ScrollBars = 2 'Vertical
TabIndex = 1
Top = 240
Width = 2655
End
End
End
Attribute VB_Name = "Sparrlista"
Attribute VB_Creatable = False
Attribute VB_Exposed = False
Private Sub Form_Load()
Rem Spärrlistan är inte inläst än
Sparrlista_inlast = False
Rem Läs in spärrlistan
Las_sparrlista
Rem Vänta tills spärrlistan är inläst
Vanta_sparrlista
End Sub
Private Sub Knapp_Sparrlista_Fardig_Click()
Rem Logga
Loggfil_text = "Anv„ndaren „r f„rdig med sp„rrlistan."
Logga
Rem Spara spärrlistan
Spara_sparrlista
Rem Göm fönstret
Sparrlista.Hide
End Sub
Private Sub Knapp_Sparrlista_Rensa_listan_Click()
Rem Logga
Loggfil_text = "Anv„ndaren rensade sp„rrlistan."
Logga
Rem Rensa spärrlistan och placera återigen markören i spärrlisterutan
Sparrlista.Sparrlista_Nummerlista.Text = ""
Sparrlista.Sparrlista_Nummerlista.SetFocus
End Sub
Filnamn: OM.FRM
VERSION 4#
Begin VB.Form Om_PhoneBlock
BorderStyle = 1 'Fixed Single
Caption = "Om PhoneBlock"
ClientHeight = 4815
ClientLeft = 1095
ClientTop = 1515
ClientWidth = 4575
ControlBox = 0 'False
Height = 5220
Icon = "OM.frx":0000
Left = 1035
LinkTopic = "Form1"
MaxButton = 0 'False
MinButton = 0 'False
ScaleHeight = 4815
ScaleWidth = 4575
Top = 1170
Width = 4695
Begin VB.CommandButton Om_PhoneBlock_Knapp_Aterga
Caption = "Återgå till programmet"
Height = 375
Left = 120
TabIndex = 8
Top = 4320
Width = 4335
End
Begin VB.Frame Om_PhoneBlock_Frame_Upphovsman
Caption = "Upphovsman"
Height = 1935
Left = 120
TabIndex = 3
Top = 2280
Width = 4335
Begin VB.Label Om_PhoneBlock_Text6
Caption = "Hemsida: http://bwiberg.home.ml.org"
Height = 255
Left = 120
TabIndex = 7
Top = 1560
Width = 2775
End
Begin VB.Label Om_PhoneBlock_Text5
Caption = "E-post: bjorn.wiberg@home.se"
Height = 255
Left = 120
TabIndex = 6
Top = 1200
Width = 2295
End
Begin VB.Label Om_PhoneBlock_Text4
Caption = "Post: Björn Wiberg, Nyodlarvägen 43, 740 22 Bälinge"
Height = 255
Left = 120
TabIndex = 5
Top = 960
Width = 3975
End
Begin VB.Label Om_PhoneBlock_Text3
Caption = $"OM.frx":0442
Height = 735
Left = 120
TabIndex = 4
Top = 360
Width = 3975
End
End
Begin VB.Frame Om_PhoneBlock_Frame_Om_PhoneBlock
Caption = "Om PhoneBlock"
Height = 2055
Left = 120
TabIndex = 0
Top = 120
Width = 4335
Begin VB.Label Om_PhoneBlock_Text2
Caption = $"OM.frx":04A2
Height = 615
Left = 120
TabIndex = 2
Top = 1320
Width = 3855
End
Begin VB.Label Om_PhoneBlock_Text1
Caption = $"OM.frx":053E
Height = 855
Left = 120
TabIndex = 1
Top = 360
Width = 3735
End
End
End
Attribute VB_Name = "Om_PhoneBlock"
Attribute VB_Creatable = False
Attribute VB_Exposed = False
Private Sub Om_PhoneBlock_Knapp_Aterga_Click()
Om_PhoneBlock.Hide
End Sub
Filnamn: MODULE.BAS
Attribute VB_Name = "Module"
Option Explicit
Rem Variabler för INPOUT (värde och portadress)
Global Value As Integer
Global PortAddress As Integer
Rem Spärrning av samtal; 0=inga, 1=enligt lista, 2=alla
Global Sparra_samtal As Integer
Rem Variabel som anger om ett samtal skall spärras till sist
Rem efter att spärrlistan har kontrollerats - uppdateras under
Rem sökningen efter matchande nummer i spärrlistan
Global Sparra_samtalet As Boolean
Rem Array med bitarna på vald parallellports statusregister
Global Bitar(8) As Boolean
Rem Inläst siffra från parallellportens statusregister
Rem Bitarna 3-6 på statusregistret motsvarar 1, 2, 4, 8 och summeras här
Global Siffra As Integer
Rem Temporär variabel
Global temp As Variant
Rem Andra temporär variabel
Global temp2 As Variant
Rem Temporär variabel där hela spärrlistan lagras
Global Hela_listan As String
Rem Nummerfragment ur spärrlistan läggs i denna variabel
Global Nummerfragment As String
Rem Temporär variabel för strängar
Global temp_string As String
Rem Sträng med inläst nummer
Global Nummer As String
Rem Används i proceduren Vanta_pa_samtal för att
Rem tala om att nummerinläsningen är klar och att
Rem inläst nummer finns i strängen Nummer
Global Fardig_med_nummerinlasning As Boolean
Rem Används i proceduren då man väntar på en ny
Rem siffra för att tala om att vi vill vänta hur
Rem länge som helst (0) eller max en sekund (1)
Global Max_sekund As Boolean
Rem Ny siffra kom inte inom en sekund vid inläsning (1)
Global Fel_vid_inlasning As Boolean
Rem I Vanta_pa_ny_siffra, vad skall vi vänta på?
Rem Tills ny siffra kommit (1) eller tills siffran upphört (0)
Global Vanta_pa_vad As Boolean
Rem Använd loggfil (1) eller inte (0)
Global Anvand_loggfil As Boolean
Rem Text att skriva till loggfilen
Rem Sätts av programmet, anropa sedan proceduren
Rem Logga
Global Loggfil_text As String
Rem Variabel som används för att hålla reda på vad
Rem för fel som inträffat vid inläsning av programmets
Rem konfigurationsfil
Global Felkod As Integer
Rem Variabel för stegning i for-loopar och liknande
Global i As Integer
Rem Variabel som visar om konfiguration av programmet är klar (1) eller ej (0)
Global Konfigurerat As Boolean
Rem Variabel som visar om konfigurationsfilen är sparad (1) eller ej (0)
Global Konfiguration_sparad As Boolean
Rem Variabel som visar om inläsning av spärrlistan är klar (1) eller ej (0)
Global Sparrlista_inlast As Boolean
Rem Variabel som sätts till 1 när en ny siffra har lästs in
Rem Nollställ innan anrop av Vanta_pa_ny_siffra så ettställs den då siffra är emottagen
Global Siffra_klar As Boolean
Rem Variabel som talar om för programmet, då ett nummer
Rem returnerats om det var ett inkommande samtal (1) eller ej (0)
Global Inkommande_samtal As Boolean
Rem Variabel som talar om om vänta-på-samtalsproceduren är klar (1) eller ej (0)
Global Vanta_samtal As Boolean
Rem Variabel som talar om att bitviktsinläsningsproceduren är klar (1) eller ej (0)
Global Bitvikt_klar As Boolean
Rem Variabler som talar om att en timer är klar
Global Timer_kort_klar As Boolean
Global Timer_lang_klar As Boolean
Public Sub Las_konfiguration()
Rem Se till att inga filer är öppna nu när vi skall ställa in programmet
Close
Rem Spärrlistan är inte inläst än
Sparrlista_inlast = False
Rem Försök att läsa in spärrlistan
Las_sparrlista
Rem Vänta tills spärrlistan är inläst och klar
Vanta_sparrlista
Rem Kolla om filen pblock.cfg finns
Rem Obefintlig fil ger felkod 1
Felkod = 1
On Error GoTo gor_installningar
Open "pblock.cfg" For Input As #3
Rem Avsaknad av rader i filen ger felkod 2
Felkod = 2
Line Input #3, temp
temp = Val(temp)
Rem Om felaktig förstarad i konfigurationsfilen, låt användaren ställa in programmet
If temp <> 1 And temp <> 2 And temp <> 3 Then
Rem Felaktigt parallellportsnummer ger felkod 3
Felkod = 3
Close #3
GoTo gor_installningar
End If
Rem Ställ in vilken parallellport vi vill arbeta med
Select Case temp
Case 1
Installningar.Installningar_Skrivarport_LPT1.Value = True
Case 2
Installningar.Installningar_Skrivarport_LPT2.Value = True
Case 3
Installningar.Installningar_Skrivarport_LPT3.Value = True
End Select
Rem Vill användaren använda sig av en loggfil?
Line Input #3, temp
temp = Val(temp)
Rem Användaren vill använda sig av en loggfil
If temp = 1 Then
Anvand_loggfil = True
Installningar.Installningar_Loggfil_Anvand_loggfil.Value = 1
Line Input #3, temp
Installningar.Installningar_Loggfil_Filnamn.Text = temp
Close #3
Rem Försök att skapa/fortsätta på loggfilen
Rem Vid öppningsfel, ge felkod 4
Felkod = 4
Open temp For Append As #1
Else
Anvand_loggfil = False
Installningar.Installningar_Loggfil_Anvand_loggfil.Value = 0
Installningar.Installningar_Loggfil_Filnamn.Text = ""
Close #3
End If
Rem Inga fel upptäcktes
Felkod = 0
Close #3
Rem Meddela det med variabeln Konfigurerat
Konfigurerat = True
GoTo slut
gor_installningar:
Rem Upplys om varför inställningar måste göras
Select Case Felkod
Case 0
GoTo slut
Case 1
temp = "Konfigurationsfil saknas - tryck på OK för att ställa in programmet."
Case 2
temp = "Konfigurationsfilen saknar rad(er) - tryck på OK för att ställa in programmet."
Case 3
temp = "Felaktig konfigurationsfil - tryck på OK för att ställa in programmet."
Case 4
temp = "Vald loggfil kunde inte öppnas eller skapas - ändra detta i inställningarna!"
End Select
Rem Visa meddelandet med en popupruta
temp = MsgBox(temp, 0, "PhoneBlock")
Rem Öppna inställningsformuläret
Installningar.Show
Rem Markera knappen "Klar" i inställningsrutan
Installningar.Installningar_Knapp_Klar.SetFocus
Rem Gör standardinställningar
Installningar.Installningar_Skrivarport_LPT1.Value = True
Installningar.Installningar_Loggfil_Anvand_loggfil.Value = 1
Installningar.Installningar_Loggfil_Filnamn.Text = "pblock.log"
slut:
End Sub
Public Sub Avslut()
Rem Logga
Loggfil_text = "Programmet avslutades."
Logga
Rem Stäng formuläret och avsluta
Huvudprogram.Hide
End
Rem Stäng filer
Close
End Sub
Public Sub Las_sparrlista()
Rem Läs in spärrlistan från lista.txt
On Error GoTo slut
Open "lista.txt" For Input As #4
temp_string = ""
Do Until EOF(4)
Line Input #4, temp
temp_string = temp_string + temp + Chr$(13) + Chr$(10)
Loop
Rem När vi är klara så finns det en carriage return och linefeed
Rem för mycket på slutet, ta bort dessa tecken
temp_string = Left$(temp_string, Len(temp_string) - 2)
Rem Uppdatera spärrlistans textfönster
Sparrlista.Sparrlista_Nummerlista.Text = temp_string
slut:
Rem Stäng filen
Close #4
Rem Spärrlistan är nu inläst
Sparrlista_inlast = True
End Sub
Public Sub Spara_sparrlista()
Rem Spara spärrlistan som lista.txt
On Error GoTo fel
Open "lista.txt" For Output As #4
Print #4, Sparrlista.Sparrlista_Nummerlista.Text
Close #4
GoTo slut
fel:
Rem Det gick inte att spara spärrlistan
Rem Informera om detta med en pop-up-ruta
temp = "Spärrlistan kunde inte sparas."
temp = MsgBox(temp, 0, "PhoneBlock")
slut:
End Sub
Public Sub Vanta_sparrlista()
Rem Vänta tills spärrlistan är inläst
Do Until Sparrlista_inlast = True
DoEvents
Loop
End Sub
Public Sub Vanta_konfiguration()
Rem Väntar på att en konfiguration av programmet är klar
Do Until Konfigurerat = True
DoEvents
Loop
End Sub
Public Sub Vanta_konfiguration_sparad()
Rem Vänta tills konfigurationen är sparad
Do Until Konfiguration_sparad = True
DoEvents
Loop
End Sub
Public Sub Logga()
Rem Kolla om loggfil används, skriv i sådana fall
Rem innehållet i variabeln Loggfil_text till loggfilen
If Anvand_loggfil = True Then
Loggfil_text = Str$(Date) + " " + Str$(Time) + " " + Loggfil_text
Print #1, Loggfil_text
End If
End Sub
Filnamn: HUVUDPRO.FRX
Filnamn: INSTALLN.FRX
Filnamn: SPARRLIS.FRX
Filnamn: OM.FRX
Bil. 6 Ladda hem programmet
Nu finns programmet PhoneBlock för nedladdning direkt från denna sida. Se kapitel 8.1 för installationsavisningar.
Filnamn | Beskrivning |
---|---|
pblock.zip | Programmet PhoneBlock v1.0 |
pblock_source.zip | Källkod till programmet PhoneBlock v1.0 |
inpout16.zip | INPOUT16.DLL |
oc25.zip | OC25.DLL |
vb40016.zip | VB40016.DLL |
Om du har synpunkter eller förslag, skicka e-post till mig på bjorn.wiberg@home.se.
Alla delar av detta arbete är © Björn Wiberg 1997-2001.
0 Kommentarer